如何删除指向其他对象(C+;+;)的指针的动态对象数组 长话短说,我必须用C++中的线性散列来为大学代码编写一个哈希表。哈希表可以工作,但资源没有被释放,这是一个问题,特别是单元测试使用100k+值测试表,留下的垃圾非常大。 基本上,在创建新哈希表时,我会执行以下操作: hashTable = new Bucket[this->tableSize]; for (size_t i = 0; i < tableSize; i++) { hashTable[i] = * new Bucket(); }
我的问题是,如何删除整个hashtable,包括可能溢出的bucket,因为下面只释放了占用内存的一半如何删除指向其他对象(C+;+;)的指针的动态对象数组 长话短说,我必须用C++中的线性散列来为大学代码编写一个哈希表。哈希表可以工作,但资源没有被释放,这是一个问题,特别是单元测试使用100k+值测试表,留下的垃圾非常大。 基本上,在创建新哈希表时,我会执行以下操作: hashTable = new Bucket[this->tableSize]; for (size_t i = 0; i < tableSize; i++) { hashTable[i] = * new Bucket(); },c++,dynamic,hash,garbage,C++,Dynamic,Hash,Garbage,我的问题是,如何删除整个hashtable,包括可能溢出的bucket,因为下面只释放了占用内存的一半 delete[] hashTable; hashTable = nullptr; 谢谢 您立即在此行中泄漏了一个桶: hashTable[i] = * new Bucket(); 它的作用是: 分配一个新的Bucket,并返回指向它的指针 取消对返回指针的引用,并将对新Bucket的引用传递给Bucket::operator= 将空的Bucket复制到已经存在的对象哈希表[i] 丢弃指向新
delete[] hashTable;
hashTable = nullptr;
谢谢 您立即在此行中泄漏了一个
桶:
hashTable[i] = * new Bucket();
它的作用是:
分配一个新的Bucket
,并返回指向它的指针
取消对返回指针的引用,并将对新Bucket
的引用传递给Bucket::operator=
将空的Bucket
复制到已经存在的对象哈希表[i]
丢弃指向新分配的存储桶的指针,从而泄漏它
hashTable
是指向tableSize
Bucket
s数组的第一个元素的指针。这些对象已经存在,因此不需要在循环中分配新对象
此外,您还没有显示Bucket
的析构函数,也没有显示如何分配Bucket::nextBucket
。我假设每个Bucket
都应该拥有自己的nextBucket
,所以您应该有一个析构函数
Bucket::~Bucket()
{
delete nextBucket;
}
您立即在此行中泄漏了一个桶:
hashTable[i] = * new Bucket();
它的作用是:
分配一个新的Bucket
,并返回指向它的指针
取消对返回指针的引用,并将对新Bucket
的引用传递给Bucket::operator=
将空的Bucket
复制到已经存在的对象哈希表[i]
丢弃指向新分配的存储桶的指针,从而泄漏它
hashTable
是指向tableSize
Bucket
s数组的第一个元素的指针。这些对象已经存在,因此不需要在循环中分配新对象
此外,您还没有显示Bucket
的析构函数,也没有显示如何分配Bucket::nextBucket
。我假设每个Bucket
都应该拥有自己的nextBucket
,所以您应该有一个析构函数
Bucket::~Bucket()
{
delete nextBucket;
}
除非我弄错了,否则以下代码行是内存泄漏:
hashTable[i] = * new Bucket();
这里要做的是在堆上分配一个新的Bucket对象,然后立即按值将其复制到数组中。使用new创建的指针超出范围,堆上的原始存储桶泄漏。剩下的是刚刚在堆中分配并泄漏的内容的副本
相反,您应该在数组中存储指针,如下所示:
hashTable = new *Bucket[this->tableSize];
for (size_t i = 0; i < tableSize; i++) {
hashTable[i] = new Bucket();
}
最后,您需要更改执行此操作的任何代码:
hashTable[i].something
为此:
hashTable[i]->something
在我看来,这是处理动态数组的正确方法。除非我弄错了,否则以下代码行是内存泄漏:
hashTable[i] = * new Bucket();
这里要做的是在堆上分配一个新的Bucket对象,然后立即按值将其复制到数组中。使用new创建的指针超出范围,堆上的原始存储桶泄漏。剩下的是刚刚在堆中分配并泄漏的内容的副本
相反,您应该在数组中存储指针,如下所示:
hashTable = new *Bucket[this->tableSize];
for (size_t i = 0; i < tableSize; i++) {
hashTable[i] = new Bucket();
}
最后,您需要更改执行此操作的任何代码:
hashTable[i].something
为此:
hashTable[i]->something
在我看来,这似乎是处理动态数组的正确方法。ABucket
本质上只是链表的一个节点。那么,删除链表的常用方法是什么呢?我没有看到Bucket
virtual~Bucket(){delete nextBucket;}
的析构函数,如果我对析构函数进行编码,程序中断,我在扩展数组时获得了EXC\u BAD\u访问权限。@cookiemonster析构函数告诉您在更上游的地方有问题。因此,您需要将析构函数留在代码中,并修复实际问题(问题不是析构函数)。Bucket本质上只是链表的一个节点。那么,删除链表的常用方法是什么呢?我没有看到Bucket
virtual~Bucket(){delete nextBucket;}
的析构函数,如果我对析构函数进行编码,程序中断,我在扩展数组时获得了EXC\u BAD\u访问权限。@cookiemonster析构函数告诉您在更上游的地方有问题。因此,您需要在代码中保留析构函数,并修复实际问题(问题不是析构函数)。析构函数与您编写的析构函数非常相似。除此之外,我还将nextBucket分配给nullptr。对于nextBucket的分配,调用add方法(const E&E)将对象添加到bucket中。如果当前bucket已满,则会创建一个新bucket,并将对象添加到该bucket中。问题是,当使用这样的析构函数时,我得到了一个EXC_BAD+access,那么您的add
方法可能有问题。最有可能导致双重空闲或空闲后使用的内容。当检查当前存储桶是否有其他溢出存储桶时,会弹出错误。但是谢谢!明天早上我会查的。析构函数和你写的差不多。除此之外,我还将nextBucket分配给nullptr。对于nextBucket的分配,调用add方法(const E&E)将对象添加到bucket中。如果当前bucket已满,则会创建一个新bucket,并将对象添加到该bucket中。问题是,当使用这样的析构函数时,我得到了一个EXC_BAD+access,那么您的add
方法可能有问题。引起混乱的事情