布団が俺を呼んでいる

丘山大一のぶろぐ

Delphi プロジェクトファイルのコードの中で無名メソッドを使うとメモリリークが発生する

なんか 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 で見かけるので、きちんと探せば原因が分かると思うのですが。
探すのめんどい(ぇ)

若干ですが仕様という名のバグじゃないか疑惑もあったりなかったり。

え、無名メソッドを使うなって?

だって楽なんだもん。
特にメソッド名を考えなくて済むあたりが楽。
……命名苦手なんよ……


コメントを書く

布団が俺を呼んでいる | 開発ツール

布団が俺を呼んでいる

丘山大一のぶろぐ

MSPaintアップデートされるってよ

http://www.winbeta.org/news/microsoft-paint-app-windows-10へー。3D対応?3D化対応するのは実に素晴らしいことだと思うんですが、「お手軽」で「 [もっと読む]

RadStudio では、generics<generics> ができない?

このごろDelphi と Firebird の記事ばかりなような。で、今回は Delphi というか Rad Studio というかのお話。Generics の中に Generics はダメ?なんか変 [もっと読む]

Firebird Embededのお勉強 ISQLの使い方 スクリプトファイルのSQLを実行できない

解決? まで3時間ほどかかりました。結論!ISQL.exe で「-i」オプションをつけて読み込ませるファイルには、BOM (Byte Order Mark) をつけてはいけないらしい。 [もっと読む]

Firebird Embededのお勉強 ISQLの使い方 DBの作り方

公式ドキュメントにも詳しく書いてありますし、検索すれば色々出てきます。これは単なる自分メモisql.exeCREATE DATABASE 'HOGE.FTB' USER 'SYSDBA' PASSWO [もっと読む]

SQL Server BCPユーティリティ 空文字はNULL文字として出力される

恥ずかしながら知りませんでした。ココで確認 [もっと読む]

FAManagementStudio なるものを作ってもらっています

お手軽に使える Firebird Embedded 用のGUIツールがなかったため、「欲すいよー」と言っていたら作ってくれました。https://github.com/degarashi0913/FA [もっと読む]

Windows Server に Git環境を構築 (GitBucket導入)

空いているパソコンサーバ(使わなくなったデスクトップPCにサーバOSを突っ込んだヤツ)があったので、そこにGitBucketを入れてみました。一応運用実績のあるサーバ=色々環境が入っているサーバ [もっと読む]

開発者向けWindows 10仮想マシンを覗いてみた

ツールやら何やら色々入っているヤツだそうで。https://developer.microsoft.com/en-us/windows/downloads/virtual-machines起動するまで [もっと読む]

UWPアプリ Windows Phone(Windows Mobile)で実機デバッグ

No調査で挑む実機デバッグ。とりあえず接続USBで接続。ロック解除。Visual Studio のデバッグをCPU「ARM」 配置先を「Device」に。F5実行!エラーwこれくらいは想定内です。あら [もっと読む]

Microsoft アカウントと紐づけられた Skype プロフィールが修正できない

全然知らなかったのですが、Microsoft アカウントを作った時点でSkypeアカウントができているのですね。ずっとSkypeアカウントを使っていたので知りませんでした。しかーし。Microsoft [もっと読む]