メモリの開放をしたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
system32

メモリの開放をしたい

#1

投稿記事 by system32 » 14年前

いつも龍神録の館で勉強させていただいています
龍神録50章のプログラムとかって結構メモリを確保しますよね(そりゃ仕方がないが)
それで思ったのですがたとえば一時的に必要な1面ボスの画像(boss1.png)をint boss1と確保したとします
でも1面が終わって2面に切り替わるのにメモリにboss1.pngの画像を保持しておくのはメモリがもったいないですよね
なのでコレを開放(?)してやりたいのですがやり方が分かりません
何かいい方法はありませんか?よろしくお願いします

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: メモリの開放をしたい

#2

投稿記事 by h2so5 » 14年前

DeleteGraph関数を使用します。

DeleteGraph(グラフィックハンドル);
とすることで、画像データを解放できます。

system32

Re: メモリの開放をしたい

#3

投稿記事 by system32 » 14年前

h2so5さん

おお、まさかこんな思い通りの関数が存在するとは
ありがとうございます、おかげで画像の開放は出来ました
でも、int a;とかで宣言した奴はこの関数では開放できませんよね
これを開放したいときはどうすればいいのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: メモリの開放をしたい

#4

投稿記事 by h2so5 » 14年前

system32 さんが書きました: でも、int a;とかで宣言した奴はこの関数では開放できませんよね
意味がよく分からないのですが、「(boss1.png)をint boss1と確保した」場合と何が違うのでしょうか?
変数の名前にかかわらず解放はできますよ。

box
記事: 2002
登録日時: 14年前

Re: メモリの開放をしたい

#5

投稿記事 by box » 14年前

system32 さんが書きました: でも、int a;とかで宣言した奴はこの関数では開放できませんよね
宣言ではなくて定義です。

その、aという変数はどこで定義しているものですか?

なお、h2s05さんの回答は、意味がよくわかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

system32

Re: メモリの開放をしたい

#6

投稿記事 by system32 » 14年前

h2so5さん

いえいえ、そういう意味ではございません
int boss1には画像を格納するといいましたが、int aには数値を格納します
中に数字が入ってる変数をDeleteGraph関数で開放できるんですか?
他にもboss_t boss;の変数bossを開放したいと思ったときはどうすればいいでしょうか?
C言語のfreeという関数を見つけたのですがこれで開放できますかね?出来るようなら使い方も教えてください

boxさん

定義と言うんですね、以後改めます
変数って龍神録的にはGV.hで定義(結果的にはmain.cppのinclude行)するものではないのですか?

引き続きよろしくお願いします

box
記事: 2002
登録日時: 14年前

Re: メモリの開放をしたい

#7

投稿記事 by box » 14年前

int a;
という定義を関数の中で行なった場合、変数の寿命は関数の内部だけにとどまります。
関数の実行開始時に変数の領域を割り当てて、終了時に(自動的に)開放します。

同じ定義を関数の外で行なった場合、変数の寿命はそのプログラムを実行しているあいだ保ち続けます。

変数の定義時に
static
という属性を与えた場合は、また別の話になります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

Re: メモリの開放をしたい

#8

投稿記事 by box » 14年前

system32 さんが書きました: 変数って龍神録的にはGV.hで定義(結果的にはmain.cppのinclude行)するものではないのですか?
私は龍神録に興味も関心もありませんのでナニですが、
変数のすべてをヘッダーファイルで定義する、とは限らないです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: メモリの開放をしたい

#9

投稿記事 by h2so5 » 14年前

一応確認しておきますが、画像格納用だろうが数値格納用だろうが、
intで定義されている以上、int boss1の中身もint aの中身も数値です。

DeleteGraph(boss1); としても、変数boss1の中身は消えていません。
変数boss1の中身の数値に対応する画像データがメモリから消されるだけです。

そして変数はローカル変数なら関数の終了時、
グローバル変数や静的変数はプログラムの終了時に自動的に解放されます。
それ以外のタイミングで明示的に解放はできません。

malloc関数で動的確保された変数であればfree関数によって解放できます。

しかし、ただ数字が入っているだけのデータなら普通はそれほどメモリを消費しませんし
ステージごとに共有する場合も多いと思うのでいちいち解放する必要性は無いかと思います。

box
記事: 2002
登録日時: 14年前

Re: メモリの開放をしたい

#10

投稿記事 by box » 14年前

グラフィック系とは全く関係ないところで
int a;
と定義した変数までDeleteGraph()で開放できる、
と書いてあるように読めてしまいましたが、
どうやら読み違いだったようですね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

system32

Re: メモリの開放をしたい

#11

投稿記事 by system32 » 14年前

box さんが書きました: 私は龍神録に興味も関心もありませんのでナニですが、
変数のすべてをヘッダーファイルで定義する、とは限らないです。
はあ、左様ですか
まあ龍神録に興味はないがこの掲示板にいるっていう人もいるんですね

system32

Re: メモリの開放をしたい

#12

投稿記事 by system32 » 14年前

h2so5 さんが書きました:一応確認しておきますが、画像格納用だろうが数値格納用だろうが、
intで定義されている以上、int boss1の中身もint aの中身も数値です。

DeleteGraph(boss1); としても、変数boss1の中身は消えていません。
変数boss1の中身の数値に対応する画像データがメモリから消されるだけです。

そして変数はローカル変数なら関数の終了時、
グローバル変数や静的変数はプログラムの終了時に自動的に解放されます。
それ以外のタイミングで明示的に解放はできません。

malloc関数で動的確保された変数であればfree関数によって解放できます。

しかし、ただ数字が入っているだけのデータなら普通はそれほどメモリを消費しませんし
ステージごとに共有する場合も多いと思うのでいちいち解放する必要性は無いかと思います。
ということはDeleteGraphというのは画像をメモリから消すだけで定義した変数は消せないのですね
まあ分かりました、メモリの開放にこだわらずにプログラム書いていこうと思います
一応コレで解決ってことで。みなさんありがとうございました。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: メモリの開放をしたい

#13

投稿記事 by Dixq (管理人) » 14年前

関数内で定義した変数であれば、関数から抜けると自動的に解放されます。
関数内でも変数の頭にstaticと付けると解放されません。
また、グローバル変数であれば最初から最後まで解放されません。
ですから、グローバル変数はリスクを高めたり可読性を下げたりするだけでなくリソースの無駄遣いにもなりますね。

動的確保をしたいなら、必要な分だけmallocで確保し、必要なくなったらfreeで解放すれば良いでしょう。

また、龍神録の館ではGV.hで変数を定義、extern宣言していますが、グローバル変数は一つも使わずに設計する事も出来ます。
http://dixq.net/g/

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: メモリの開放をしたい

#14

投稿記事 by ISLe » 14年前

何でも宣言と言っておけば良いと思いますけど。
実体の確保をともなう宣言のことを定義と言うのですから。

system32

Re: メモリの開放をしたい

#15

投稿記事 by system32 » 14年前

Dixq (管理人) さんが書きました:関数内で定義した変数であれば、関数から抜けると自動的に解放されます。
関数内でも変数の頭にstaticと付けると解放されません。
また、グローバル変数であれば最初から最後まで解放されません。
ですから、グローバル変数はリスクを高めたり可読性を下げたりするだけでなくリソースの無駄遣いにもなりますね。

動的確保をしたいなら、必要な分だけmallocで確保し、必要なくなったらfreeで解放すれば良いでしょう。

また、龍神録の館ではGV.hで変数を定義、extern宣言していますが、グローバル変数は一つも使わずに設計する事も出来ます。
http://dixq.net/g/
欲しい時に欲しい分だけ確保して要らなくなったら捨てるとかは出来ないんですね
でもコレだといけないとかそういう事もないのでこのままやっていこうと思います
さっき付け忘れてたんで今度は解決マーク付けときます
みなさんありがとうございました

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: メモリの開放をしたい

#16

投稿記事 by h2so5 » 14年前

容量が大きく任意に確保・解放したいデータがどうしてもあるなら、
(C++での話ですが)動的確保してスマートポインタなどを使う手もあります。

しかしこの場合も任意確保・解放できるのはポインタの指しているデータのみで、
ポインタ自体は解放できません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: メモリの開放をしたい

#17

投稿記事 by softya(ソフト屋) » 14年前

必要な領域をDixq (管理人) さんの言われるとおりmallocで確保・解放することは出来ます。
ただ、初心者がそこまでやるとだいたい致命的なバグを作ります。
それにプロでも必要な変数の領域は無理して全て確保・解放なんてしません。
手間・無駄なメモリの量・安全性などを総合的に見て動的に確保するか・静的に確保するかを決めるのが普通です。

[追記]
例えばint型の変数を1個開放したところで4バイトしか減りません(現実にはmallocの場合違います)。その確保・解放とバグの出る可能性を考えたら確保・解放しないほうが確実で効率的です。

[追記の追記]
ただ、mallocでの確保・解放は凄くメモリ管理についての勉強になります。
なので、龍神録のグローバル変数をまとめて確保・解放できる単位で構造体にまとめて管理してみると難しさや現実性が実感できると思います。
1つの変数毎にポインタを設けるとメモリが減らず意味有りませんので、必ず幾つかの変数をまとめて構造体にして構造体のポインタで管理くださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る