Bitmap.Freeのタイミングはどのようにすればよいのですか?

解決


あきお  2001-11-08 00:34:24  No: 277  IP: [192.*.*.*]

よくBitmapを使うとき↓のように書きますよね?

procedure TForm1.FormCreate(Sender: TObject);
var
Bitmp: TBitmap;
begin

Bitmp:=TBitmap.Create;
     .
     .
  ビットマップにいろいろな処理をする
     .
     .
Bitmp.Free;
end;

このとき最後のBitmp.Freeはなぜいつも書き込まれているのですか?
僕の書いたプログラムだと(ここに書き込むにはちょっとごちゃごちゃしすぎなんです)Bitmp.Freeをつけるとアドレス違反とか言われてエラーになってしまいます。で、Bitmp.Freeを書かないでコンパイル実行をするとうまく動作します。どのようなときに .Free が必要でどのようなときに .Free がなくてもよいのでしょうか?

編集 削除
にしの  2001-11-08 11:39:29  No: 278  IP: [192.*.*.*]

Freeが必要な理由は、
「Bitmap.Createしているから」
です。

基本的に、自分で作ったオブジェクトは自分で解放します。
場合によっては、呼び出された関数の中でオブジェクトを解放してしまう場合もあります。
もし、ごちゃごちゃするのがいやでしたら、FormCreateでビットマップをつくり、FormDestroyでビットマップを破棄するようにすればすっきりします。
つまり、1度作ったビットマップを使い回しするわけです。
これも場合によっては、使いまわすのはよくないときもあります。

編集 削除
あきお  2001-11-13 23:21:51  No: 279  IP: [192.*.*.*]

せっかく答えていただいたのに、お返事が遅れてしまってすみません。もしも、自分で作ったオブジェクトを開放しなかった場合、どのようなことがおきるのですか?フォームを閉じたあともずっとメモリーの中にビットマップが居座ってしまうのですか?

編集 削除
にしの  2001-11-14 02:06:55  No: 280  IP: [192.*.*.*]

フォームを閉じた後も残ります。
アプリケーションが終了したときには、たぶん解放されます。
本当に解放されるかどうかはわかりません。未確認です。

もし、確実に解放したいのであれば、TObjectListクラスを使うと楽に出来ます。
これを使う場合は、2つ以上のオブジェクトを使うのでなければ、手間が増えるだけです。
TObjectListクラスを使う場合、これのオブジェクトの生成・解放は必要ですから。
他にも、Systemユニット(もしくはSharedMemユニット)よりも先に、SysGetMem,SysFreeMem,SysReallocMem関数を用意してしまうという手もあります。

編集 削除
あきお  2001-11-15 00:55:27  No: 281  IP: [192.*.*.*]

メモリーのことは考え出すと面倒ですね。けど、これを使いこなせるようになればちょっとかっこよさそうですね。これからもたびたびお邪魔すると思うのでよろしくお願いします。

編集 削除