24. 9月 2016 14:09
/
丘山大一
/
Blog . プログラミング . Delphi
コメント (0)
なんか Delphi 話多いなー。
無名メソッド、anonymous methods とか言われるヤツです。
正直、可読性が落ちると思っているのですが、サクッと書くときに便利なのでちょいちょい使います。
現象
下記のようなコードを書くと、メモリリークが発生します。
program Project1;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
b :Boolean;
begin
ReportMemoryLeaksOnShutdown := True; // メモリリークを検出
b :=
(function : Boolean
begin
Result := True;
end
)();
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
対応
無名メソッドを使わないようにするしか思いつきませんでした……
program Project1;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
function hoge : Boolean;
begin
Result := True;
end;
var
b :Boolean;
begin
ReportMemoryLeaksOnShutdown := True; //メモリリークを検出
b := hoge;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
原因予想
全然分かりません。
・Delphiの無名メソッドはインターフェースでどうたかこうだか、
・インターフェースは参照カウントがどうたかこうだか、
・でもってインターフェースの破棄のタイミングはEnd 節の実行時でどうたかこうだか、
・でもプロジェクトファイルにあるのは「end.」(ピリオド)であって「end;」(セミコロン)じゃないなー
とか妄想してみた。
似たような事例はStackoverflow で見かけるので、きちんと探せば原因が分かると思うのですが。
探すのめんどい(ぇ)
若干ですが仕様という名のバグじゃないか疑惑もあったりなかったり。
え、無名メソッドを使うなって?
だって楽なんだもん。
特にメソッド名を考えなくて済むあたりが楽。
……命名苦手なんよ……