Я использую VirtualTreeView в C ++ Builder и использую его со следующей структурой:
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/ рекомендует использовать Finalize () в OnFreeNode
событии. Хорошо до сих пор.
Но в C ++ нет Finalize (). Я попробовал pNode->Caption=""
в событии OnFreeNode
, и память больше не выделяется так резко, но это все еще немного. Я думаю, что ссылка на UnicodeString может остаться, даже если она пуста (счетчик ссылок> 0).
Как освободить данные узла в событии OnFreeNode
для UnicodeString в C ++? Я знаю, что UnicodeString выделяется до тех пор, пока все счетчики ссылок не станут равными нулю - так как мне заставить счетчик ссылок стать равным нулю?
Кроме того, что, если узел выделен в OnNodeInit
- применимо ли то же самое к событию OnFreeNode
?
Что, если структура TVTNodeData является чисто виртуальной - узел никогда не виден и не инициализируется ни с помощью AddChild, ни с помощью OnNodeInit, тогда требуется финализация, тогда эта структура вообще существует в памяти?
Обновление: позже я обнаружил, что неправильно измерял использование памяти и что для строк достаточно установить пустую строку для очистки данных в памяти. Но - как предлагает Роб Кеннеди в своем ответе ниже, вызов struct ~ destructor даже лучше и эквивалентен Finalize, а также проще, поскольку он очищает всю структуру (если в ней больше строк).
NodeDataSize
? также попробуйте проверить каждый узел, который вы добавляете в дерево, такжеWideString
вариант для заголовка ?. - person kobik   schedule 17.04.2012VTree->NodeDataSize = sizeof(TVTNodeData);
перед циклом. WideString возможен, но в чем преимущество его использования? Это не подсчет ссылок, поэтому установка пустой строки освобождает всю память? Разве UnicodeString не более дружественен к VCL? - person Coder12345   schedule 17.04.2012WideString
потребляет меньше памяти, чемUnicodeString
.Widestring
содержит только 4-байтовое целое число (длина строки) в дополнение к символьным данным, тогда какUnicodeString
содержит два 4-байтовых целых числа (длина строки и счетчик ссылок) и два 2-байтовых целых числа (размер элемента каждого символа - всегда 2 - и кодовая страница строки - всегдаCP_UTF16
) в дополнение к символьным данным. - person Remy Lebeau   schedule 18.04.2012