Hashtable / Doubly链表中的内存泄漏

时间:2016-05-07 18:35:49

标签: c++ memory memory-management memory-leaks

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

  • 听(这是双重链表)
  • Hashtable(这是一个具有灵活插槽数的简单哈希表)
  • Tester(这是一个测试类,用于计算密钥比较并将其打印到一系列案例的csv文件中)

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 ++编写代码之前,我从未遇到过内存管理方面的麻烦。

1 个答案:

答案 0 :(得分:0)

看起来你永远不会删除最后一个游标,因为它的前一个游标将为null。 如果(CURSOR-&GT;!PREV = NULL) ... 其他 删除光标;打破;

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