UnicodeStringがメモリリークする

解決


くりぼ  2015-01-18 08:11:28  No: 46965

DelphiXE + FastMM4.991なのですが、デバッグ後のメモリリークレポートで
毎回UnicodeStringのリークが検出されます。
4045BE [System][@GetMem]
406BC3 [System][@NewUnicodeString]
406DD4 [System][@UStrFromPWCharLen]
407CA5 [System][@UStrCopy]

「The block is currently used for an object of class: UnicodeString」

該当箇所で文字列操作しているものは「TStringList」、「SplitString」
くらいです。
VCL側がリークしているのでしょうか。
何か解決方法があればお教えください。


DEKO  2015-01-18 23:37:34  No: 46966

私は気にしない事にしています (^^;A

これが起こる原因の一つは IDE からのデバッグ実行にあります。

[Memory leak in target app if using Debugger's evaluator tooltips]
http://qc.embarcadero.com/wc/qcmain.aspx?d=73762

普通に実行するとメモリリークしないのに、
ブレークポイントを置いてそこにある変数をツールチップヒントで
表示させるとメモリリークする等、デバッグ実行時のみ発生する
メモリリークが幾つかあるようです。

リリースモードで再構築し、EXE 単体で実行した際にはレポートされない
メモリリークは無視していいかと思います。

もう一つはグローバル変数です。

グローバル変数の文字列はタイミングによってメモリリークが
報告される事があります。よくあるのが *.dpr に記述した変数です。
これらは空文字を代入して終了しないとメモリリークが報告される事があります。

# 空文字を代入しても解決しない場合もあるのですが (w

> 該当箇所で文字列操作しているものは...

実際のコードを確認した訳ではないので何とも言えないのですが、
上記のような事例もありますよ、って事で。


くりぼ  2015-01-19 03:30:07  No: 46967

DEKOさん、返信ありがとうございます。

> リリースモードで再構築し、EXE 単体で実行した際にはレポートされない
> メモリリークは無視していいかと思います。

上記状態でもどうしてもメモリリークが検出されていたのですが、
以下の方法で検出されなくなることに成功しました。

・SplitStringで生成した動的配列の内の1要素の文字列を、
  レコード型のポインタのメンバであるString型の変数に代入していました。
・レコード型のポインタを開放する前に、上記メンバに空文字列を
  代入してから開放するようにしました。★メモリリークしなくなった

レコード型のポインタそのものを開放するだけでは駄目なのですね。
解決にあたって、以下の投稿で、開放前に空文字列をセットしている
点が一助となりました。
https://www.petitmonte.com/bbs/answers?question_id=4623

DEKOさんに提示していただいた情報も今後似たような状況になった
ときのヒントとなりそうです。
この度はありがとうございました。


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

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






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