【问题标题】:Clearing a hash table in C++在 C++ 中清除哈希表
【发布时间】:2013-11-18 02:47:38
【问题描述】:

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

【问题讨论】:

  • 取出新节点
  • 仍然出现 1 个内存泄漏错误。
  • 奇怪的是你的代码看起来像this guy's

标签: c++ hash memory-leaks hashtable


【解决方案1】:

你做一个StoreThenDel = new Node。这会为堆上的Node 分配内存。之后您执行StoreThenDel = temp,丢失有关您在堆上为Node 分配内存的位置的信息。

【讨论】:

    【解决方案2】:

    你的while循环和临时变量很混乱,试着把代码简化成下面这样,你会发现更简单的代码问题更少。

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

    【讨论】:

      【解决方案3】:
      Node* StoreThenDel = new Node;
      

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

      while(temp->next != nullptr)
      

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        • 2023-03-04
        相关资源
        最近更新 更多