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

时间:2017-11-06 18:51:52

标签: c++

我有以下代码使用迭代器将项目插入到双链表中。这就是我们被要求这样做的方式。代码有效,但问题是我有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对象,因为我正在返回指向它的迭代器,并在我的链接列表中使用它。

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

我看到的一个问题是您没有更新当前节点的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;
}