在C++中清除哈希表

Clearing a hash table in C++

本文关键字:哈希表 清除 C++      更新时间:2023-10-16

我创建了一个clear()函数,当被调用时,它会清除整个哈希表并将大小重置为0。该函数导致我的程序内存泄漏,但我没有发现可能的泄漏。。这是我的clear()函数:

void HashMap::clear()
{
unsigned int capacity = HashMap::bucketCount();
for (unsigned int i = 0; i < capacity; i++)
{
    Node* temp;
    Node* StoreThenDel = new Node;
    if (HashTable[i] != nullptr)
    {
        temp = HashTable[i];
        HashTable[i] = nullptr;
        while(temp->next != nullptr)
        {
            StoreThenDel = temp;
            if(StoreThenDel->next != nullptr)
                  temp = StoreThenDel->next;
            delete StoreThenDel;
        }
     }
}
  sz=0; // reset size
}

您执行StoreThenDel = new Node。这将为堆上的Node分配内存。然后执行StoreThenDel = temp,丢失有关在堆上为Node分配内存的位置的信息。

while循环和temp变量非常令人困惑,请尝试将代码简化为以下内容,您会发现更简单的代码问题更少。

for (unsigned int i = 0; i < capacity; ++i)
{
    while (HashTable[i] != nullptr)
    {
         Node* temp = HashTable[i];
         HashTable[i] = temp->next;
         delete temp;
    }
}
Node* StoreThenDel = new Node;

这个new是一个泄漏,没有必要。

while(temp->next != nullptr)

此循环条件停止得太早。它应该运行到temp != nullptr。按原样,它会泄露每个列表中的最后一个条目。

  if(StoreThenDel->next != nullptr)
       temp = StoreThenDel->next;

temp的分配不应该是有条件的。