我正在阅读一个geeksforgeeks_implementation_of_trie,我发现由“new”创建的TreeNode对象是未删除的,在main函数中,有一个未删除的指针“root”:
struct TrieNode *root = getNode();
并且在函数getNode中还有未删除的指针“pNode”,是否存在内存泄漏? 是否应该有一个函数负责破坏由指针组成的trie树?
struct TrieNode *getNode(void)
{
struct TrieNode *pNode = new TrieNode;
pNode->isEndOfWord = false;
for (int i = 0; i < ALPHABET_SIZE; i++)
pNode->children[i] = NULL;
return pNode;
}
此函数暗示了一个约定,其中函数的调用方负责删除分配的Trienode
。 只有当呼叫者不遵守合同时才会出现内存泄漏。
既然您说trienode
不会在main
中的任何位置删除,那么很可能存在泄漏。 除非你能找到这个结构被删除的地方,否则就有漏洞。 这就是为什么RAII是一个如此强大的概念。 如果有一个trie
对象包含所有trienode
,并负责节点分配和删除,那么您就完全不必担心泄漏。
让调用方负责管理已分配的资源是危险的。 别这么做。
如果程序足够简单,只需获取trienode
,处理它们,然后退出,那么您可以认为这个特定的实现不一定是泄漏。 在这种情况下,内存将被释放到操作系统上的程序退出无论如何。 但这是一个语义上的争论,提供这样做的示例代码是一个糟糕的实践,并且可能导致cargo cult程序员去做这种糟糕的实践。