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