gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:50:06 28 4
gpt4 key购买 nike

我有以下代码使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我有 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;
}

关于c++ - 如何删除正在使用的对象(节点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47143764/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com