析构函数,它还为C ++中的特定哈希类释放内存

时间:2014-09-29 22:28:10

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

我正在学习C ++并尝试编写Hash类。到目前为止一切都很好,除了当我的程序完成使用哈希类时,我的哈希表有一个内存泄漏。我希望得到一些帮助,编写一个析构函数来删除存储在堆中的元素。

这是我的hashclass.h文件:

class Hash {
public:
    Hash();
    /* Bunch of methods here*/
    virtual ~Hash();
private:
    static const int size = 20;

    struct item{
        string name;
        int number;
        item* next;
    };

    item* HashTable[size];

};

在我的hashclass.cpp中,我的构造函数有以下实现:

Hash::Hash(){
    for (int i = 0; i < size; i++) {
        HashTable[i] =  new item;
        HashTable[i]->name = "";
        HashTable[i]->number = 0;
        HashTable[i]->next = NULL; 
    }

}

是否有人能够解释如何编写适当的析构函数来解除分配用于构建此哈希表的所有内存块。

2 个答案:

答案 0 :(得分:0)

析构函数的一种方法。

Hash::~Hash(){
    for (int i = 0; i < size; i++) {
        // first: you must delete HashTable[i]->next <-- your homework.
        // second: delete HashTable[i]
        if (HashTable[i])
            delete HashTable[i];
    }
}

作为一般规则,您应始终具有相同数量的operator new和operator delete。如果您有operator new [],则必须使用operator delete []。

例如,分配:

char * foo = new char[size];

释放:

delete [] foo;

答案 1 :(得分:0)

鉴于你的来源,自然析构函数将是:

Hash::~Hash()
{
    for (int i=0; i<size; ++i)
    {
        while (HashTable[i])
        {
            item *victim = HashTable[i];
            HashTable[i] = victim->next;
            delete victim;
        }
    }
}

注意:您的课程不符合 Rule of Three。阅读链接的文章,因为它很重要,越早学习它就越好。