動作環境
C++ Builder XE4
FastMM
メモリーリーク対策中。
症状
以下のような外部ファイルを実装していた。
- コンストラクタ
- TStringList変数を確保
- SetDataStr()
- 未初期化時にはTStringList変数 = new()
- 引数の文字列をDelimitedTextでTStringListに格納
- GetDataStr()
- TStringListに格納した項目をインデックス指定で取得
- デストラクタ
- TStringList変数を解放
上記の処理を実行していて、確認したところ、一度だけnew()をしていた。
ところが、FastMM自体では30回近くDelimitedTextでメモリリークが発生しているとなった。
対策
以下とした。
- TStringList型でなく、String型のprivate変数を用意
- コンストラクタ
- 何もしない
- SetDataStr()
- private変数に格納
- GetDataStr()
- std::unique_ptr<>にてTStringList変数を宣言、初期化
- private変数のString文字列をTStringList変数にDelimitedText指定で渡す
- 指定のインデックスの項目をreturn
- デストラクタ
- private変数にL""を格納 (不要かもしれない)
上記のファイルに関するメモリリークはなくなった。
FastMMが誤って報告している可能性はある。
GetDataStr()のたびにTStringListを作るのは効率は悪いかもしれない。
結果
こちらの修正をして、かつFastMMによるメモリリークを避けるためFastMMをはずしてビルドしなおした。
修正前は30分で2MBのリークがあったが、修正後は30分で0MBのリークになった。