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

Destructor that also deallocates memory for a particular Hash Class in C++

本文关键字:哈希类 释放 内存 C++ 析构函数      更新时间:2023-10-16

我正在学习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; 
    }
}

有人能解释如何编写正确的析构函数来释放用于构建这个哈希表的所有内存块吗。

给定源,自然析构函数将是:

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

注意:您的类不符合三规则。阅读链接文章,因为它很重要,你越早学会越好。

析构函数的一种方法。

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];
    }
}

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

例如,分配:

char * foo = new char[size];

解除分配:

delete [] foo;