Delphi 13 のGetItにて SmartCore AI Components(OpenAI や Gemini の API を使えるコンポーネント)をインストールして、
試したとき、デモプログラムを使ってみたら、そのプロジェクトファイルに、
ReportMemoryLeaksOnShutdown := True;
が指定してあり、メモリリークがあると、プログラム終了時に、メモリリークの内容が表示するようになっていました。
Delphi・Lazarus 掲示板
https://www.petitmonte.com/bbs/questions?lang_id=1
で挙げられていた mam さんの、
DelphiでGemini APIを使用してAIと会話を行う(TNetHTTPClient)
https://mam-mam.net/delphi/vcl_gemini.html
DelphiでGemini APIを使用してAIに画像を解析してもらう(TNetHTTPClient)
https://mam-mam.net/delphi/vcl_gemini_image.html
を試したとき、プロジェクトファイルに
ReportMemoryLeaksOnShutdown := True;
を指定し、実行したら、終了時に、
Unexpected Memory Leak
An unexpected memory leak has occurred. The unexpected small block leaks are:
29 - 36 bytes: TStringStream x 1
と表示されました。
すぐには原因がわからなかったので、
gpt-5.6-terra
gemini-3.6-flash
に聞いたところ、
原因は「TStringStream を 2回 Create して、最初のインスタンスへの参照を上書きしていることです。」
とのこと。
ASource := TStringStream.Create; // 1個目を生成
try
NetHTTPClient1.ContentType := 'application/json';
ASource := TStringStream.Create(JsonStr, TEncoding.UTF8);
// ↑ ASource を上書き。1個目の TStringStream は参照を失い Free できない
res := NetHTTPClient1.Post(
...,
ASource, nil, nil
);
finally
ASource.Free; // Free されるのは2個目だけ
end;
修正方法は「最初の `Create` を削除し、生成を1回だけにします。」
ということなので、
ASource := TStringStream.Create(JsonStr, TEncoding.UTF8);
をtryの前に移動し、最初の
ASource := TStringStream.Create;
を削除すれば良さそうです。