C++ Builder で VirtualTreeView を使用し、次のような構造で使用します。
struct TVTNodeData
{
int Index;
UnicodeString Caption;
}
これを持つループを使用して、ツリーのノードを事前に入力します。
TVirtualNode *Node = VTree->AddChild(NULL);
pNode = (TVTNodeData *)VTree->GetNodeData(Node);
pNode->Index = 1;
pNode->Caption = "Whatever";
ツリーをクリアしてリロードしても、アプリケーションのメモリが常に増加していることに気付きました (メモリ リーク)。このページ - http://www.remkoweijnen.nl/blog/2010/06/09/memory-leaks-when-using-virtual-treeview-component/OnFreeNode
は、イベントで Finalize() を実行することを推奨しています。これまでのところ良い。
ただし、C++ には Finalize() はありません。イベントで試してみたところpNode->Caption=""
、OnFreeNode
メモリはそれほど劇的に割り当てられなくなりましたが、それでも少しです。空になっても UnicodeString への参照が残っている可能性があると思います (参照カウント > 0)。
OnFreeNode
C++ で UnicodeString のイベントでノード データを解放するにはどうすればよいですか? すべての参照カウントがゼロになるまで UnicodeString が割り当てられることはわかっています。では、参照カウントを強制的にゼロにするにはどうすればよいでしょうか?
また、ノードが割り当てられている場合はどうなりますかOnNodeInit
- イベントにも同じことが当てはまりOnFreeNode
ますか?
TVTNodeData 構造が純粋に仮想である場合はどうなりますか? AddChild も OnNodeInit も使用せずにノードが表示されたり初期化されたりすることはありません。
更新:後で、メモリ使用量を誤って測定していたこと、および文字列を空の文字列に設定するだけでメモリ データをクリアするのに十分であることがわかりました。しかし、ロブ・ケネディが以下の回答で示唆しているように、 struct ~destructor を呼び出すことは、 Finalize と同等であり、構造全体をクリアするため (より多くの文字列が含まれている場合) よりも簡単です。