3

我遇到了删除和析构函数的问题(我确定我在这里犯了一个愚蠢的错误,但到目前为止还没有弄清楚)。

当我进入析构函数并尝试在指针上调用 delete 时,消息显示“Cannot access memory at address some address ”。

相关代码为:

/*
 * Removes the front item of the linked list and returns the value stored
 * in that node.
 *
 * TODO - Throws an exception if the list is empty
 */
std::string LinkedList::RemoveFront()
{
    LinkedListNode *n = pHead->GetNext(); // the node we are removing
    std::string rtnData = n->GetData(); // the data to return

    // un-hook the node from the linked list
    pHead->SetNext(n->GetNext());
    n->GetNext()->SetPrev(pHead);

    // delete the node
    delete n;
    n=0;

    size--;
    return rtnData;
}

/*
 * Destructor for a linked node.
 *
 * Deletes all the dynamically allocated memory, and sets those pointers to 0.
 */
LinkedListNode::~LinkedListNode()
{
    delete pNext; // This is where the error pops up
    delete pPrev;
    pNext=0;
    pPrev=0;
}
4

3 回答 3

5

您似乎正在从析构函数中删除列表的下一个和上一个节点。其中,如果pNextpPrevLinkedListNode*,意味着您正在递归删除整个列表:-(

试试这个:

std::string LinkedList::RemoveFront()
{
    LinkedListNode *n = pHead->GetNext(); // the node we are removing
    std::string rtnData = n->GetData(); // the data to return

    // un-hook the node from the linked list
    pHead->SetNext(n->GetNext());
    n->GetNext()->SetPrev(pHead);

    n->SetNext(0);
    n->SetPrev(0);
    // delete the node
    delete n;
    n=0;

    size--;
    return rtnData;
}

LinkedListNode::~LinkedListNode()
{
}

(实际上,您甚至不需要将 prev 和 next 指针重置为 0,因为无论如何您都将删除节点。我保留了这些语句,因为它们至少使节点处于一致状态,这是一个好主意一般。如果您稍后更改内存管理策略并决定存储未使用的节点以供以后重用,这可能会有所不同。)

于 2010-04-17T20:56:19.680 回答
1

似乎您LinkedListNode正在删除其邻居,因此当您删除一个节点时,它会继续销毁整个列表 - 请注意,您没有设置pNextpPrev在删除节点时设置为 NULL。

LinkedListNode即使在您希望整个列表被销毁的情况下,您的析构函数也是有问题的:同时拥有并且delete pNextdelete pPrev导致同一个析构函数的多次调用(我认为最终会导致堆栈溢出)。

于 2010-04-17T20:58:27.363 回答
0

实际上,您不应该与节点中的邻居混淆。这是列表类要做的 - 正确连接它们。在析构函数中,您可以将它们设置为 null,但除非您动态分配了其他东西 - 您不必调用delete

于 2010-04-17T20:59:59.430 回答