1

我正在尝试学习 C++,但我有一点困惑。

我从中学习的文本告诉我,如果我想删除一个类型的节点,const T&我应该首先创建一个该节点类型的新指针,然后使用内置的 C++ 删除它delete[]。但是,如果我只是将要删除节点的上一个元素的链接设置到要删除的节点的下一个元素的链接,会发生什么?就像是:

*p = node.previous;
p-> next = node.next;

或者这会导致内存泄漏吗?

我很困惑,因为我在其他地方读到永远不会删除指针,但我正在使用的示例代码具有以下内容:

Node<T> *p = node-to-be-deleted;
delete p;

删除节点的最佳方法是什么?

4

4 回答 4

2

假设您的节点如下所示:

struct Node
{
    Node*  previous;
    Node*  next;

    SomeType data;
};

然后:

*p = node.previous;
p-> next = node.next;

然后。这将导致内存泄漏。
它还p->next->prev指向错误的节点。

我很困惑,因为我在其他地方读到永远不会删除指针,但我正在使用的示例代码具有以下内容:

是的,最好的方法是“永不删除指针”。但这必须与一些背景相一致。您不应该手动删除指针,因为指针应该由控制其生命周期的对象管理。这些对象中最简单的是智能指针或容器。但是对于这种情况,这将是矫枉过正(因为您正在创建容器)。

在创建容器(列表)时,您需要自己进行管理(注意 C++ 已经有几个丢失的类型 std::list 用于 t 类型的值列表或 boost::ptr_list 用于指针列表到 T)。但尝试自己做是一个很好的练习。

这是一个初学者制作列表及其生成的评论的代码审查示例:

http://codereview.stackexchange.com:C++的链表

我希望这有助于解释如何创建和删除对象。

于 2013-01-08T00:34:33.660 回答
1
Node* p = new Node; // This is how you allocate a node
delete p; // This is how you delete it

delete[] 运算符应该用于动态分配的数组

Node* nodelist = new Node[ 4 ]; // nodelist is now a (dynamically allocated) array with 4 items.
delete[] nodelist; // Will delete all 4 elements (which is actually just one chunk of memory)
于 2013-01-07T21:40:18.367 回答
0
void deleteNode( Node * p )
{
    Node * temp = p->next;
    p->data = p->next->data;
    p->next = temp->next;
    free(temp);
}

这是我几个月前做的事情。

template <class T>
T LinkedList<T>::remove(int pos)
{
    if (pos < 1 || pos > size)
    {
        throw pos;
    }
    ListNode * temp;
    if (pos == 1)
    {
        temp=head;
        head = head->next;
    }
    else
    {
        int i=1;
        ListNode * prev = head;

        while(i<pos-1)
        {
            i++;
            prev=prev->next;
        }
        temp = prev->next;

        prev->next = (prev->next)->next;

    }
    --size;
    return temp->item;
}
于 2013-01-07T21:40:24.303 回答
0

仅当实现析构函数来更新周围实例的和指针时,直接删除Node才有意义,例如:NodepreviousnextNode

Node::~Node()
{
    if (previous) previous->next = next;
    if (next) next->previous = previous;
}

Node *p = node-to-be-deleted;
delete p;

否则,您必须先更新Node指针,然后再删除有Node问题的指针,例如:

Node *p = node-to-be-deleted;
if (p->previous) p->previous->next = p->next;
if (p->next) p->next->previous = p->previous;
delete p;

话虽如此,最好的方法是不要一开始就手动实现链表。在 C++ 中,请改用std::list容器,让它为您处理这些细节。

于 2013-01-07T21:47:51.577 回答