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側がリークしているのでしょうか。
何か解決方法があればお教えください。
私は気にしない事にしています (^^;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
> 該当箇所で文字列操作しているものは...
実際のコードを確認した訳ではないので何とも言えないのですが、
上記のような事例もありますよ、って事で。
DEKOさん、返信ありがとうございます。
> リリースモードで再構築し、EXE 単体で実行した際にはレポートされない
> メモリリークは無視していいかと思います。
上記状態でもどうしてもメモリリークが検出されていたのですが、
以下の方法で検出されなくなることに成功しました。
・SplitStringで生成した動的配列の内の1要素の文字列を、
レコード型のポインタのメンバであるString型の変数に代入していました。
・レコード型のポインタを開放する前に、上記メンバに空文字列を
代入してから開放するようにしました。★メモリリークしなくなった
レコード型のポインタそのものを開放するだけでは駄目なのですね。
解決にあたって、以下の投稿で、開放前に空文字列をセットしている
点が一助となりました。
https://www.petitmonte.com/bbs/answers?question_id=4623
DEKOさんに提示していただいた情報も今後似たような状況になった
ときのヒントとなりそうです。
この度はありがとうございました。
ツイート | ![]() |