析构函数,它还为C++中的特定哈希类释放内存。 我在学习C++的过程中,试图编写一个哈希类。到目前为止,一切都很好,除了当我的程序使用完hash类时,有一个与我的hash表相关的内存泄漏。我希望得到一些帮助,编写一个析构函数,删除堆中存储的元素
这是我的hashclass.h文件:析构函数,它还为C++中的特定哈希类释放内存。 我在学习C++的过程中,试图编写一个哈希类。到目前为止,一切都很好,除了当我的程序使用完hash类时,有一个与我的hash表相关的内存泄漏。我希望得到一些帮助,编写一个析构函数,删除堆中存储的元素,c++,memory-management,hash,memory-leaks,destructor,C++,Memory Management,Hash,Memory Leaks,Destructor,这是我的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* HashTabl
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++) {
// first: you must delete HashTable[i]->next <-- your homework.
// second: delete HashTable[i]
if (HashTable[i])
delete HashTable[i];
}
}
解除分配:
char * foo = new char[size];
delete [] foo;
根据你的来源,自然析构函数应该是:
Hash::~Hash()
{
for (int i=0; i<size; ++i)
{
while (HashTable[i])
{
item *victim = HashTable[i];
HashTable[i] = victim->next;
delete victim;
}
}
}
注意:您的类不符合要求。阅读链接文章,因为它很重要,学习得越早越好。除了析构函数,为什么要用动态分配来启动初始指针数组中的每个插槽。该插槽中的nullptr足以将此处的任何内容表示为node to nowhere。并且项需要它自己的参数化构造函数,因为您应该找到它们的唯一需要时间是当您有数据要存储在第一位时。请详细说明我如何使用这些信息来构建一个释放内存的析构函数?说到这些,我是个新手。谢谢你。您提到了…并且该项需要它自己的参数化构造函数,因为您应该发现需要它们的唯一时间是当您首先要存储数据时。我确实在项目中存储数据。就像电话簿一样。因此,用户插入数据,键值对存储在哈希表中。我需要初始化项结构中的参数吗?我使用参数化构造函数的意思很简单:如果您采用表最初填充nullptr的理念,那么您唯一需要创建项的时间是在您实际将真实数据插入冲突列表表时。具有一个构造函数,该构造函数以const std::string&s,int n,item*next=nullptr作为参数列表,并使用。把你的物品处理得足够久,原因就会变得更加明显。太好了。我将使用您的建议。话虽如此,我是否也应该初始化'item'中的结构变量?我仍然在valgrind中遇到一些类型的内存错误。然后运行valgrind报告,找到分配的位置,并修复它。我所说的“三不服从”规则是正确的。阅读这篇文章,并调试您似乎无法销毁泄漏的内容的地方。