我正在为我的CS课程工作,我们正在开发自己的简单哈希表实现。为此,我创建了多个类:
Tester为每次运行生成一个新的哈希表。例如,当我为每次运行执行100次运行的测试时,将在删除旧的哈希表之后创建新的哈希表。这是必需的,因为测试通常会改变插槽的数量。
在哈希表的每个槽中都有一个指向双向链表的指针,该列表是在哈希表的构造函数中创建的。该列表提供了插入值,查找值,获取上次搜索的密钥比较和清除所有元素的方法。析构函数调用方法清除双向链表中的所有元素。在运行结束时调用析构函数,我用调试消息检查它。我还试图检查我之前创建的内存中是否清除了相同数量的元素,但引用计数始终适合。
我的问题是,每次运行Tester后都会分配更多的内存。如果你在哈希表中进行大量运行或运行大量元素,这是一个真正的问题,因为它需要几兆或几千兆的内存。
我的IDE是OS X上Xcode的最新版本。我使用Instruments(分析工具)来查找泄漏的代码,但它只是建议查看我的add-method。
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++;
}
当然这是分配内存的地方,但是后来我的clear-method应该在游戏后期被析构函数触发时删除所有这些元素:
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;
}
在有什么仪器告诉我之后,add-method是唯一一个在使用后没有释放内存的地方,所以我希望你可以帮我解决这个内存泄漏问题。我有多种编程语言的经验,但在用C ++编写代码之前,我从未遇到过内存管理方面的麻烦。
答案 0 :(得分:0)
看起来你永远不会删除最后一个游标,因为它的前一个游标将为null。 如果(CURSOR-&GT;!PREV = NULL) ... 其他 删除光标;打破;
您也不需要其他删除游标调用,因为它始终为null。