用C ++清除哈希表

时间:2013-11-18 02:47:38

标签: c++ hash memory-leaks hashtable

我创建了一个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
}

3 个答案:

答案 0 :(得分:3)

你做StoreThenDel = new Node。这为堆上的Node分配内存。然后你执行StoreThenDel = temp,丢失有关为堆上的Node分配内存的信息。

答案 1 :(得分:0)

Node* StoreThenDel = new Node;

new是泄漏,不需要。

while(temp->next != nullptr)

此循环条件过早停止。它应该运行到temp != nullptr。因为它泄漏了每个列表中的最后一个条目。

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

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

答案 2 :(得分:0)

你的while循环和临时变量只是非常混乱,尝试将代码简化为类似下面的内容,你会发现更简单的代码有更少的问题。

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