c++ - 如何在 C++ 中编写正确的哈希表析构函数

标签 c++ memory-leaks hashmap hashtable destructor

我正在编写一个 C++ 哈希表

这是我的析构函数:

HashMap::~HashMap()
{
    for (int i=0; i<cap; i++)
    {
        Node* ptr = Hashtable[i];
        while (ptr!=NULL)
        {
            Node* delptr;
            delptr=ptr;
            ptr=ptr->next;
            delete delptr;
        }
    }
    delete [] Hashtable;
}

我的添加功能:

void HashMap::add(const std::string& key, const std::string& value)
{
    int index = hashfunction(key)%cap;;

    Node* ptr=Hashtable[index];
    Node* newnode=new Node;

    if (contains(key)==false)
    {
        if (ptr == nullptr)
        {

            newnode->key=key;
            newnode->value=value;
            newnode->next=NULL;
            Hashtable[index]=newnode;
        }
        else
        {
            newnode->key=key;
            newnode->value=value;
            newnode->next=NULL;

            while(ptr->next != NULL)
            {
                ptr = ptr->next;
            }
            ptr->next=newnode;
         }}}

但是我不断收到内存泄漏错误

==13676== 
==13676== HEAP SUMMARY:
==13676==     in use at exit: 12 bytes in 1 blocks
==13676==   total heap usage: 42 allocs, 41 frees, 669 bytes allocated
==13676== 
==13676== 12 bytes in 1 blocks are definitely lost in loss record 1 of 1
==13676==    at 0x402BE94: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==13676==    by 0x804BF8D: HashMap::add(std::string const&, std::string const&) (HashMap.cpp:112)
==13676==    by 0x804AFD2: main (main.cpp:18)
==13676== 
==13676== LEAK SUMMARY:
==13676==    definitely lost: 12 bytes in 1 blocks
==13676==    indirectly lost: 0 bytes in 0 blocks
==13676==      possibly lost: 0 bytes in 0 blocks
==13676==    still reachable: 0 bytes in 0 blocks
==13676==         suppressed: 0 bytes in 0 blocks
==13676== 
==13676== For counts of detected and suppressed errors, rerun with: -v
==13676== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

其表示的行是 Node* newnode=new Node;因为我这里使用了“new”,所以这个newnode需要被释放,但析构函数只释放Hashtable中的内容。如果我不使用“newnode”,我会出现空指针访问错误,因为nullptr无法访问Node(Node是一个有键和值的结构体),我只能让指针指向“newnode”。然而,添加额外的“删除新节点”会让我收到 20 多个错误。我真的需要你的帮助!

如果我这样写,我仍然会收到错误

if (contains(key)==false)
{
    if (ptr == nullptr)
    {
        Node* newnode=new Node;
        newnode->key=key;
        newnode->value=value;
        newnode->next=NULL;
        Hashtable[index]=newnode;
    }
    else
    {
        Node* newnode=new Node;
        newnode->key=key;
        newnode->value=value;
        newnode->next=NULL;

        while(ptr->next != NULL)
        {
            ptr = ptr->next;
        }
        ptr->next=newnode;
     }}

最佳答案

这一行

Node* newnode=new Node; 

创建一个本地 newnode 指针,该指针在 add 函数退出后将超出范围。这将泄漏 new 分配的内存。

关于c++ - 如何在 C++ 中编写正确的哈希表析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037721/

相关文章:

c++ - 在托管包装器中包装非托管 C++

javascript - 我可以从开发工具中获取 GC 的内存吗?

c# - 使用 Plinq AsParallel 时出现内存泄漏

java - 创建HashMap作为标题关键词的索引,提高搜索效率

c++ - Unordered_map 使用指针地址作为键

c++ - 设置为值的指针和设置为值地址的指针有什么区别?

c++ - 不能使用指针作为默认模板参数

java - 京都内阁/伯克利 DB : Hash table size limitations

c++ - 使用#include 将大块重复代码放入单独的文件中是否可以和/或正常?

c++ - 程序终止时,仪器不会捕获未删除的对象