长话短说,我必须使用 C++ 中的线性哈希为大学编写一个哈希表。哈希表有效,但资源没有被释放,这是一个问题,尤其是单元测试测试具有 100k+ 值的表并且留下的垃圾是巨大的。 基本上,当我创建新的哈希表时,我会执行以下操作:
hashTable = new Bucket[this->tableSize];
for (size_t i = 0; i < tableSize; i++) {
hashTable[i] = * new Bucket();
}
每个 Bucket 都可以包含一个指向另一个溢出桶的指针,可以设置也可以不设置。
class Bucket {
private:
size_t bucketSize;
size_t elementsInBucket;
E v[N]; // int v[N];
bool hasOverflow;
Bucket * nextBucket = nullptr;
我的问题是,我怎样才能删除整个哈希表,包括带有潜在溢出桶的桶,因为下面只释放了一半占用的内存。
delete[] hashTable;
hashTable = nullptr;
谢谢!
最佳答案
您立即在这一行泄漏了一个 Bucket
:
hashTable[i] = * new Bucket();
它的作用是:
- 分配一个新的
Bucket
并返回指向它的指针 - 取消引用返回的指针并将对新
Bucket
的引用传递给Bucket::operator=
- 将空的
Bucket
复制到已经存在的对象hashTable[i]
- 丢弃指向新分配的
Bucket
的指针,从而泄漏它
hashTable
是指向 tableSize
Bucket
数组的第一个元素的指针。这些对象已经存在,因此您无需在循环中分配新对象。
此外,您没有显示 Bucket
的析构函数,也没有显示您如何分配 Bucket::nextBucket
。我假设每个 Bucket
都应该拥有它的 nextBucket
,所以你应该有一个析构函数来做类似的事情
Bucket::~Bucket()
{
delete nextBucket;
}
关于c++ - 如何删除带有指向其他对象的指针的动态对象数组 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368871/