トップへ(mam-mam.net/)

Delphi掲示板~DelphiでGemini APIを使用のプログラムで、メモリリーク

Delphi掲示板

一覧に戻る

DelphiでGemini APIを使用のプログラムで、メモリリーク

解決済
igy
(2026-07-24 13:37:00)
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;
を削除すれば良さそうです。
mam
(2026-07-28 17:05:18)
igy様

ご指摘ありがとうございます。
おっしゃる通り正にご指摘の箇所でメモリリークがありましたので修正いたしました。
https://mam-mam.net/delphi/vcl_gemini.html
https://mam-mam.net/delphi/vcl_gemini_image.html

返信

名前
1~16文字
質問に対する返信
1~4000文字
解決
解決時にON
解決済
返信