続・関数がクラスのインスタンスを返してくる場合

解決


かえで  2004-03-29 22:10:51  No: 8011

前回の質問ではみなさんにたくさんのアドバイスをしていただき、
とても勉強になりました。
どうもありがとうございました。
それで一旦解決としてしまいましたが、あとで疑問な点が出てきましたので、
スレッドを新しくして再度質問させてください。
疑問な点というのは、sadoyamaさんが書いてくださった文章の次の2点です。

> CreateされたDestがどこでも開放されないままこの関数を抜けてしまいますので、メモリーリークになります。
メモリーリークですか!
これはDoSomething関数自体がダメということでしょうか?

> Object引数につき const, varは不要
これはDoSomething関数の宣言部を
function DoSomething(const Src: TBitmap): TBitmap;
と記述したので書いてくださったのだと思うのですが、私は引数がTBitmap型の場合でも
constやvarは有効と思っていました。
間違いなのでしょうか?
確かVCLのソースコードでも使われていたはずなのですが。(今検索しています)


jok  2004-03-29 22:19:30  No: 8012

>> 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;

のように使うなら、何の問題もないと思います。


jok  2004-03-29 22:25:14  No: 8013

>私は引数がTBitmap型の場合でも
>constやvarは有効と思っていました。

有効ですよ。でも、実体がポインタ渡しなので const にすると内容のコピーを
しなくてすむ。しかし、関数内では、その変数の内容を更新できない。 var を
使うとポインタのポインタみたいになってむしろない方がいい。今回の例でしたら
引数は参照するだけなので、const をつけるといいです。


かえで  2004-03-30 02:36:54  No: 8014

>jokさん、みなさん

DoSomething関数は特に問題はないのですね。
念のために他にTBitmap型を返す関数がないか探してみました。
結果、中村拓男さんという方が公開されている「Delphi High-Level Graphic Library」
の中のBitmapUtilsにいくつかあることを確認できました。
つっかさんに教えていただいたTFormのGetFormImageメソッドもありますので、
これで安心して使えます。
ただ、使い方を忘れないようにしないと。
takeさんにいただいたアドバイスにしたがって、コメントをしっかり書いておきます。

constとvarはTBitmap型でも有効だったのですね。
これもVCLのClassesの中に見つけることができました。
TStream型やTComponent型の引数にconstとvarが使用されていました。

おかげさまで今度こそ解決できました。
前回も含めレスを下さったみなさん、どうもありがとうございました。


かえで  2004-03-30 02:38:35  No: 8015

すみません、解決をチェックし忘れました。


sadoyama  URL  2004-03-30 08:27:38  No: 8016

大変失礼しました。私の間違いでした。

jokさん  wrote
>関数自体が Free してない、という意味でメモリリークとは関係ありません。
>まえにかえでさんが書いていた

procedure TForm1.Button1Click(Sender: TObject);
var
  // 以下コード略
end;

>のように使うなら、何の問題もないと思います。

そのとおりでした。混乱させて申し訳ありませんでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加