ページ 1 / 1
メモリの開放をしたい
Posted: 2011年5月05日(木) 20:51
by system32
いつも龍神録の館で勉強させていただいています
龍神録50章のプログラムとかって結構メモリを確保しますよね(そりゃ仕方がないが)
それで思ったのですがたとえば一時的に必要な1面ボスの画像(boss1.png)をint boss1と確保したとします
でも1面が終わって2面に切り替わるのにメモリにboss1.pngの画像を保持しておくのはメモリがもったいないですよね
なのでコレを開放(?)してやりたいのですがやり方が分かりません
何かいい方法はありませんか?よろしくお願いします
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 20:55
by h2so5
DeleteGraph関数を使用します。
DeleteGraph(グラフィックハンドル);
とすることで、画像データを解放できます。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 21:01
by system32
h2so5さん
おお、まさかこんな思い通りの関数が存在するとは
ありがとうございます、おかげで画像の開放は出来ました
でも、int a;とかで宣言した奴はこの関数では開放できませんよね
これを開放したいときはどうすればいいのでしょうか?
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 21:08
by h2so5
system32 さんが書きました:
でも、int a;とかで宣言した奴はこの関数では開放できませんよね
意味がよく分からないのですが、「(boss1.png)をint boss1と確保した」場合と何が違うのでしょうか?
変数の名前にかかわらず解放はできますよ。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 21:14
by box
system32 さんが書きました:
でも、int a;とかで宣言した奴はこの関数では開放できませんよね
宣言ではなくて定義です。
その、aという変数はどこで定義しているものですか?
なお、h2s05さんの回答は、意味がよくわかりません。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 21:19
by system32
h2so5さん
いえいえ、そういう意味ではございません
int boss1には画像を格納するといいましたが、int aには数値を格納します
中に数字が入ってる変数をDeleteGraph関数で開放できるんですか?
他にもboss_t boss;の変数bossを開放したいと思ったときはどうすればいいでしょうか?
C言語のfreeという関数を見つけたのですがこれで開放できますかね?出来るようなら使い方も教えてください
boxさん
定義と言うんですね、以後改めます
変数って龍神録的にはGV.hで定義(結果的にはmain.cppのinclude行)するものではないのですか?
引き続きよろしくお願いします
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 21:32
by box
int a;
という定義を関数の中で行なった場合、変数の寿命は関数の内部だけにとどまります。
関数の実行開始時に変数の領域を割り当てて、終了時に(自動的に)開放します。
同じ定義を関数の外で行なった場合、変数の寿命はそのプログラムを実行しているあいだ保ち続けます。
変数の定義時に
static
という属性を与えた場合は、また別の話になります。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 21:35
by box
system32 さんが書きました:
変数って龍神録的にはGV.hで定義(結果的にはmain.cppのinclude行)するものではないのですか?
私は龍神録に興味も関心もありませんのでナニですが、
変数のすべてをヘッダーファイルで定義する、とは限らないです。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 21:35
by h2so5
一応確認しておきますが、画像格納用だろうが数値格納用だろうが、
intで定義されている以上、int boss1の中身もint aの中身も数値です。
DeleteGraph(boss1); としても、変数boss1の中身は消えていません。
変数boss1の中身の数値に対応する画像データがメモリから消されるだけです。
そして変数はローカル変数なら関数の終了時、
グローバル変数や静的変数はプログラムの終了時に自動的に解放されます。
それ以外のタイミングで明示的に解放はできません。
malloc関数で動的確保された変数であればfree関数によって解放できます。
しかし、ただ数字が入っているだけのデータなら普通はそれほどメモリを消費しませんし
ステージごとに共有する場合も多いと思うのでいちいち解放する必要性は無いかと思います。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 22:00
by box
グラフィック系とは全く関係ないところで
int a;
と定義した変数までDeleteGraph()で開放できる、
と書いてあるように読めてしまいましたが、
どうやら読み違いだったようですね。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 22:01
by system32
box さんが書きました:
私は龍神録に興味も関心もありませんのでナニですが、
変数のすべてをヘッダーファイルで定義する、とは限らないです。
はあ、左様ですか
まあ龍神録に興味はないがこの掲示板にいるっていう人もいるんですね
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 22:03
by system32
h2so5 さんが書きました:一応確認しておきますが、画像格納用だろうが数値格納用だろうが、
intで定義されている以上、int boss1の中身もint aの中身も数値です。
DeleteGraph(boss1); としても、変数boss1の中身は消えていません。
変数boss1の中身の数値に対応する画像データがメモリから消されるだけです。
そして変数はローカル変数なら関数の終了時、
グローバル変数や静的変数はプログラムの終了時に自動的に解放されます。
それ以外のタイミングで明示的に解放はできません。
malloc関数で動的確保された変数であればfree関数によって解放できます。
しかし、ただ数字が入っているだけのデータなら普通はそれほどメモリを消費しませんし
ステージごとに共有する場合も多いと思うのでいちいち解放する必要性は無いかと思います。
ということはDeleteGraphというのは画像をメモリから消すだけで定義した変数は消せないのですね
まあ分かりました、メモリの開放にこだわらずにプログラム書いていこうと思います
一応コレで解決ってことで。みなさんありがとうございました。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 22:32
by Dixq (管理人)
関数内で定義した変数であれば、関数から抜けると自動的に解放されます。
関数内でも変数の頭にstaticと付けると解放されません。
また、グローバル変数であれば最初から最後まで解放されません。
ですから、グローバル変数はリスクを高めたり可読性を下げたりするだけでなくリソースの無駄遣いにもなりますね。
動的確保をしたいなら、必要な分だけmallocで確保し、必要なくなったらfreeで解放すれば良いでしょう。
また、龍神録の館ではGV.hで変数を定義、extern宣言していますが、グローバル変数は一つも使わずに設計する事も出来ます。
http://dixq.net/g/
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 23:10
by ISLe
何でも宣言と言っておけば良いと思いますけど。
実体の確保をともなう宣言のことを定義と言うのですから。
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 23:16
by system32
Dixq (管理人) さんが書きました:関数内で定義した変数であれば、関数から抜けると自動的に解放されます。
関数内でも変数の頭にstaticと付けると解放されません。
また、グローバル変数であれば最初から最後まで解放されません。
ですから、グローバル変数はリスクを高めたり可読性を下げたりするだけでなくリソースの無駄遣いにもなりますね。
動的確保をしたいなら、必要な分だけmallocで確保し、必要なくなったらfreeで解放すれば良いでしょう。
また、龍神録の館ではGV.hで変数を定義、extern宣言していますが、グローバル変数は一つも使わずに設計する事も出来ます。
http://dixq.net/g/
欲しい時に欲しい分だけ確保して要らなくなったら捨てるとかは出来ないんですね
でもコレだといけないとかそういう事もないのでこのままやっていこうと思います
さっき付け忘れてたんで今度は解決マーク付けときます
みなさんありがとうございました
Re: メモリの開放をしたい
Posted: 2011年5月05日(木) 23:23
by h2so5
容量が大きく任意に確保・解放したいデータがどうしてもあるなら、
(C++での話ですが)動的確保してスマートポインタなどを使う手もあります。
しかしこの場合も任意確保・解放できるのはポインタの指しているデータのみで、
ポインタ自体は解放できません。
Re: メモリの開放をしたい
Posted: 2011年5月06日(金) 00:45
by softya(ソフト屋)
必要な領域をDixq (管理人) さんの言われるとおりmallocで確保・解放することは出来ます。
ただ、初心者がそこまでやるとだいたい致命的なバグを作ります。
それにプロでも必要な変数の領域は無理して全て確保・解放なんてしません。
手間・無駄なメモリの量・安全性などを総合的に見て動的に確保するか・静的に確保するかを決めるのが普通です。
[追記]
例えばint型の変数を1個開放したところで4バイトしか減りません(現実にはmallocの場合違います)。その確保・解放とバグの出る可能性を考えたら確保・解放しないほうが確実で効率的です。
[追記の追記]
ただ、mallocでの確保・解放は凄くメモリ管理についての勉強になります。
なので、龍神録のグローバル変数をまとめて確保・解放できる単位で構造体にまとめて管理してみると難しさや現実性が実感できると思います。
1つの変数毎にポインタを設けるとメモリが減らず意味有りませんので、必ず幾つかの変数をまとめて構造体にして構造体のポインタで管理くださいね。