掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
関数がクラスのインスタンスを返してくる場合 (ID:7999)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
投稿者が「解決」としているのを蒸し返して申し訳ありませんが。 メモリーリークに関して言えば、問題は function DoSomething(Bitmap: TBitmap): TBitmap; にあります。 示されたところによると、 function DoSomething(const Src: TBitmap): TBitmap; var Dest: TBitmap; begin Assert(Assigned(Src)); Dest := TBitmap.Create; { Srcのデータを使用してDestを加工 } Result := Dest; end; という内容です。 CreateされたDestがどこでも開放されないままこの関数を抜けてしまいますので、メモリーリークになります。 アプリそのものを終了する際には開放されますので、100個くらいのBitmapを処理するぶんには不都合は起きないでしょうが。 >こんなことしても大丈夫でしょうか? >それとも、この場合は代入しているからOKで、 > Bitmap.Assign(DoSomething(Bitmap)); >みたいにするとメモリリークしちゃうのですか? この質問への直接の答えにはなっていませんが、いずれにせよ、上記の問題が解決しないといかなる質問も有効とはならいと考えます。 ではどうすれば良いかですが、面倒なので突き詰めて調べるに至っていません。 ただ、私が十分な使用を繰り返していて、実践的には不都合が起きていない方法を紹介しておきます。 正しい処理だという理論的確信はありませんが、たかみちえ さんと同じ方式のようです。 たかみちえ さん wrote >procedure DoSomething(Bitmap: TBitmap;var Dest: TBitmap); >として渡された変数Destを使って"戻り先として使うビットマップに、ビットマップをコピーする"ということをした方がいいかもしれませんね。 >この方が、ぱっと見"どのようなBitmapを必要としてる"のか、わかりやすいと思います。 かえで さん wrote >生成は呼び出した側でした方が見通しがよさそうですね。 以下のコードはたぶんこれと同じ考え方でしょう。 procedure DoSomething(Src, Dest: TBitmap);// procedureに変更 begin // Object引数につき const, varは不要 Assert(Assigned(Src)); Assert(Assigned(Dest)); { Srcのデータを使用してDestを加工 } end; procedure TForm1.Button1Click(Sender: TObject); var DestBmp: TBitmap; begin Image1.Picture.Bitmapに画像をセット DestBmp := TBitmap.Create; try DoSomething(Image1.Picture.Bitmap, DestBmp); DestBmp.SaveToFile(????? + 'Result.bmp'); finally DestBmp.Free; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.