如何删除正在使用的对象(节点)

How to delete an object ( node ) which is in use

本文关键字:对象 节点 何删除 删除      更新时间:2023-10-16

我有以下代码,可以使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我的绝对内存泄漏为 24 字节。

NodeIterator<T> insert(NodeIterator<T> & itrPassed, const T datapassed)
{
    Node<T> * newNode = new Node<T>(datapassed);
    Node<T>* previousOfCurrent = itrPassed.getCurrent()->previous;
    previousOfCurrent-> next = newNode;
    newNode -> previous = previousOfCurrent;
    newNode -> next = itrPassed.getCurrent();
    itrPassed.setCurrent(newNode);
    return itrPassed;
}

我知道问题是由这条线引起的Node<T> * newNode = new Node<T>(datapassed);.我无法删除 newNode 对象,因为我返回了一个指向它的迭代器,并且它在我的链表中使用。

如何解决这个问题?

我看到的一个问题是您没有更新当前节点的previous。当前节点的previous仍指向旧节点。因此,如果使用 previous 迭代节点,则将跳过新创建的节点。

我看到的另一个问题是您在访问previousOfCurrent而不检查它是否是有效的指针。

不确定修复它们是否会解决您的内存泄漏问题。

NodeIterator<T> insert(NodeIterator<T> & itrPassed, const T datapassed)
{
    Node<T> * newNode = new Node<T>(datapassed);
    Node<T>* previousOfCurrent = itrPassed.getCurrent()->previous;
    // Prevent accessing a nullptr
    if ( previousOfCurrent != nullptr )
    {
       previousOfCurrent-> next = newNode;
       newNode -> previous = previousOfCurrent;
    }
    newNode -> next = itrPassed.getCurrent();
    // Add this
    itrPassed.getCurrent()->previous = newNode;
    itrPassed.setCurrent(newNode);
    return itrPassed;
}