我在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()。我尝试在 OnFreeNode
事件中使用 pNode->Caption=""
,虽然分配的内存减少了,但仍然有点。我认为可能还有对 UnicodeString 的引用,尽管它已经被清空了(引用计数 > 0)。
在 C++ 中,如何在 OnFreeNode
事件中释放 UnicodeString 的节点数据?我知道 UnicodeString 在所有引用计数为零之前都会被分配 - 那么我如何强制引用计数变为零呢?
另外,在 OnNodeInit
中分配节点时,情况是否相同适用于 OnFreeNode
事件呢?
更新:后来我发现我错误地测量了内存使用情况,并且对于字符串来说,将它们设置为空字符串就足以清除内存数据。但正如Rob Kennedy在他下面的回答中建议的那样,调用struct ~destructor甚至更好,相当于Finalize,而且更容易,因为它清除整个结构(如果您在其中有更多的字符串)。
NodeDataSize
?同时尝试验证您添加到树中的每个节点,此外,WideString
是否是标题的选项? - kobikWideString
消耗的内存比UnicodeString
少。Widestring
仅包含一个4字节整数(字符串长度)以及字符数据,而UnicodeString
包含两个4字节整数(字符串长度和引用计数)和两个2字节整数 (每个字符的元素大小 - 始终为2 - 和字符串代码页 - 始终为CP_UTF16
)以及字符数据。 - Remy Lebeau