提问者:小点点

这个geeksforgeeks trie实现有内存泄漏问题吗?


我正在阅读一个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; 
} 

共1个答案

匿名用户

此函数暗示了一个约定,其中函数的调用方负责删除分配的Trienode。 只有当呼叫者不遵守合同时才会出现内存泄漏。

既然您说trienode不会在main中的任何位置删除,那么很可能存在泄漏。 除非你能找到这个结构被删除的地方,否则就有漏洞。 这就是为什么RAII是一个如此强大的概念。 如果有一个trie对象包含所有trienode,并负责节点分配和删除,那么您就完全不必担心泄漏。

让调用方负责管理已分配的资源是危险的。 别这么做。

如果程序足够简单,只需获取trienode,处理它们,然后退出,那么您可以认为这个特定的实现不一定是泄漏。 在这种情况下,内存将被释放到操作系统上的程序退出无论如何。 但这是一个语义上的争论,提供这样做的示例代码是一个糟糕的实践,并且可能导致cargo cult程序员去做这种糟糕的实践。