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