前回の質問ではみなさんにたくさんのアドバイスをしていただき、
とても勉強になりました。
どうもありがとうございました。
それで一旦解決としてしまいましたが、あとで疑問な点が出てきましたので、
スレッドを新しくして再度質問させてください。
疑問な点というのは、sadoyamaさんが書いてくださった文章の次の2点です。
> CreateされたDestがどこでも開放されないままこの関数を抜けてしまいますので、メモリーリークになります。
メモリーリークですか!
これはDoSomething関数自体がダメということでしょうか?
> Object引数につき const, varは不要
これはDoSomething関数の宣言部を
function DoSomething(const Src: TBitmap): TBitmap;
と記述したので書いてくださったのだと思うのですが、私は引数がTBitmap型の場合でも
constやvarは有効と思っていました。
間違いなのでしょうか?
確かVCLのソースコードでも使われていたはずなのですが。(今検索しています)
>> CreateされたDestがどこでも開放されないままこの関数を抜けてしまいますので、メモリーリークになります。
>メモリーリークですか!
>これはDoSomething関数自体がダメということでしょうか?
関数自体が Free してない、という意味でメモリリークとは関係ありません。
まえにかえでさんが書いていた
procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
begin
Bitmap := DoSomething(Image1.Picture.Bitmap);
try
Bitmap.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Result.bmp');
finally
Bitmap.Free;
end;
end;
のように使うなら、何の問題もないと思います。
>私は引数がTBitmap型の場合でも
>constやvarは有効と思っていました。
有効ですよ。でも、実体がポインタ渡しなので const にすると内容のコピーを
しなくてすむ。しかし、関数内では、その変数の内容を更新できない。 var を
使うとポインタのポインタみたいになってむしろない方がいい。今回の例でしたら
引数は参照するだけなので、const をつけるといいです。
>jokさん、みなさん
DoSomething関数は特に問題はないのですね。
念のために他にTBitmap型を返す関数がないか探してみました。
結果、中村拓男さんという方が公開されている「Delphi High-Level Graphic Library」
の中のBitmapUtilsにいくつかあることを確認できました。
つっかさんに教えていただいたTFormのGetFormImageメソッドもありますので、
これで安心して使えます。
ただ、使い方を忘れないようにしないと。
takeさんにいただいたアドバイスにしたがって、コメントをしっかり書いておきます。
constとvarはTBitmap型でも有効だったのですね。
これもVCLのClassesの中に見つけることができました。
TStream型やTComponent型の引数にconstとvarが使用されていました。
おかげさまで今度こそ解決できました。
前回も含めレスを下さったみなさん、どうもありがとうございました。
すみません、解決をチェックし忘れました。
大変失礼しました。私の間違いでした。
jokさん wrote
>関数自体が Free してない、という意味でメモリリークとは関係ありません。
>まえにかえでさんが書いていた
procedure TForm1.Button1Click(Sender: TObject);
var
// 以下コード略
end;
>のように使うなら、何の問題もないと思います。
そのとおりでした。混乱させて申し訳ありませんでした。
ツイート | ![]() |