gpt4 book ai didi

c++ - 哈希表/双向链表中的内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:36 25 4
gpt4 key购买 nike

我正在为我的 CS 类(class)工作,我们正在开发我们自己的简单哈希表实现。为此,我创建了多个类:

  • Liste(这是一个双向链表)
  • 哈希表(这是一个具有灵活数量槽的简单哈希表)
  • 测试员(这是一个测试类,它计算键比较并将它们打印到 csv 文件中以用于一系列案例)

测试器为每次运行生成一个新的哈希表。例如,当我对每次运行执行 100 次运行的测试时,将在删除旧哈希表后创建一个新哈希表。这是必需的,因为通常槽的数量会因测试而改变。

哈希表的每个槽中都有一个指向双向链表的指针,它是在哈希表的构造函数中创建的。该列表提供了插入值、查找值、获取上次搜索的键比较和清除所有元素的方法。析构函数调用清除双向链表中所有元素的方法。析构函数在运行结束时被调用,我用调试消息检查了它。我还尝试检查是否从我之前创建的内存中清除了相同数量的元素,但引用计数总是合适的。

我的问题是每次运行测试程序后都会分配更多内存。如果您执行大量运行或运行哈希表中的大量元素,这将是一个真正的问题,因为它需要兆字节或千兆字节的内存。

我的 IDE 是 OS X 上最新版本的 Xcode。我使用 Instruments(分析工具)查找泄漏代码,但它只是建议查看我的添加方法。

    void Liste::add(int key, int wert)
{
Element *createdElement = new Element();
this->referenceCount++;

createdElement->wert = wert;
createdElement->key = key;

if(this->head == NULL && this->tail == NULL)
{
this->head = createdElement;
this->tail = createdElement;
}
else
{
tail->next = createdElement;
createdElement->prev = this->tail;
this->tail = createdElement;
}

this->size++;
}

当然这是分配内存的地方,但我稍后的清除方法应该在游戏稍后被析构函数触发时删除所有这些元素:

    void Liste::clear()
{
cout << "Liste::clear() is fired." << endl;
Element *cursor = this->head;

while (cursor != NULL)
{
if(cursor->prev != NULL)
{
delete cursor->prev;
cursor->prev = NULL;
this->referenceCount--;
}

cursor = cursor->next;
}

delete cursor;
this->referenceCount--;

this->head = NULL;
this->tail = NULL;
this->size = 0;
}

在 Instruments 告诉我后,add 方法是唯一分配内存但在使用后未释放的地方,所以我希望你能帮助我解决这个内存泄漏问题。我有使用多种编程语言的经验,但在不得不使用 C++ 编写代码之前,我从未在内存管理方面遇到过这么多麻烦。

最佳答案

看起来您永远不会删除最后一个游标,因为它的前一个游标将为空。如果(光标->prev!=null)...别的删除游标;休息;

您也不需要其他删除游标调用,因为它始终为空。

关于c++ - 哈希表/双向链表中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37092274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com