C++11 删除哈希表中的对象指针
我有一个带有链接的哈希表,其中每个节点是:C++11 删除哈希表中的对象指针,c++11,pointers,C++11,Pointers,我有一个带有链接的哈希表,其中每个节点是: struct Node { Object * objPtr; Node * next; } 当我从文件中读取数据时,我创建了一个对象: ... Object * currObj; currObj = new Object; //Causes memory leaks (doesn't get deleted) //Save data currObj->setData(data); //Insertion insert(*cur
struct Node
{
Object * objPtr;
Node * next;
}
当我从文件中读取数据时,我创建了一个对象:
...
Object * currObj;
currObj = new Object; //Causes memory leaks (doesn't get deleted)
//Save data
currObj->setData(data);
//Insertion
insert(*currObj);
对于这种情况,什么是正确的析构函数?我有一个表的析构函数和一个对象的析构函数,但是currObj=newobject
似乎会导致泄漏
表析构函数:
//delete each chain
int i;
for (i = 0; i<capacity; i++)
{
Node * head = table[i];
Node * curr;
while (head)
{
curr = head->next;
head->next = NULL;
delete head;
head = curr;
}
}
//delete the array
delete[] table;
UPD-插入
void Table::insert(Object & obj_)
{
char key[200];
char curr[100];
obj_.getKeywords(key); //Get keywords for the passed obj
char * token;
token = strtok(key, "?"); //Ge the first keyword
//Loop to add nodes for each keyword from the passed object
while (token != NULL)
{
int index = calculateIndex(token); //calculate index based of the
//first keyword
//Create new node
Node * newNode = new Node;
newNode->obj = &obj_;
newNode->next = NULL;
//Link node and table
newNode->next = table[index];
table[index] = newNode;
size++;
token = strtok(NULL, "?"); //Get next keyword
}
}
对于
节点
,您需要一个析构函数,它需要类似以下内容:
Node::~Node()
{
if ( objPtr != NULL ) {
delete objPtr;
objPtr = NULL;
}
if ( next != NULL ) {
delete next;
next = NULL;
}
}
当您的表析构函数调用
delete head
时,将调用节点
析构函数。默认情况下,它将有一个析构函数,但不会专门释放/删除分配的对象。显示您已经拥有的所有析构函数代码。上面的第二个代码段位于Node?@MrJLP Updated中。请使用智能指针(shared_ptr
)并保存问题“insert”方法的代码是什么?反引用运算符*
在我看来很奇怪。(如果方法是insert(Object o)
而不是insert(Object&o)
删除,则无法工作。)您不需要If
s。删除null ptr是可以的。正如@EdHeal指出的,null检查是不必要的,但是如果您想使用它们,我建议在调用delete之后将指针设置为null ptr
。如果一个对象在被销毁后被重用,至少这会使调试变得更容易——是的,我知道这是未定义的行为。是的,我更喜欢只在指针有效时才显式删除。随后将设置添加到NULL
。使用NULL
而不是nullptr
与给定的现有示例代码一致。它仍然不会删除数据。我猜我没有正确地插入,所以它无法在调试器中逐步完成后正确删除,或者添加日志行以了解发生了什么。无论如何,您都需要节点
析构函数
Node::~Node()
{
if ( objPtr != NULL ) {
delete objPtr;
objPtr = NULL;
}
if ( next != NULL ) {
delete next;
next = NULL;
}
}