c++ - 将 shared_ptr 用于 linked_list 在析构函数中给出 stackoverflow

标签 c++ linked-list stack-overflow shared-ptr

我正在尝试使用 shared_ptr 而不是原始指针来实现链表。代码:

#include <memory>
class NodeTest
{
private:
    int v;
    std::shared_ptr<NodeTest> next;
public:
    NodeTest() { v = 0; };
    NodeTest(unsigned int i) { v = i; }
    ~NodeTest() {};
    void setNext(std::shared_ptr<NodeTest> & toSet) { next = toSet; }
};

std::shared_ptr<NodeTest> init()
{
    std::shared_ptr<NodeTest> elt = std::shared_ptr<NodeTest>(new NodeTest());
    std::shared_ptr<NodeTest> first = elt;
    for (unsigned int i = 1; i < 5000; i++)
    {
        std::shared_ptr<NodeTest> next(new NodeTest(i));
        elt->setNext(next);
        elt = next;
    }
    return first;
}

void test_destroy()
{
    std::shared_ptr<NodeTest> aList = init();
}


int main(int argc, char * argv[])
{
    test_destroy();
}

由于调用了 aList 析构函数 (RAII),因此在离开 test_destroy() 作用域时会产生堆栈溢出。为了销毁 aList,它调用了 next 的析构函数,依此类推,对于足够大的列表,这显然会导致 stackoverflow。

我找不到任何有效的方法来解决这个问题。理想的情况是在移动到 next 删除之前删除当前的 NodeTest,对吧?你会怎么做?

提前致谢

解决方案:您需要断开所有节点之间的链接并保存指向每个节点的指针,以便在断开链接时不会立即调用析构函数。以下示例使用 vector 。

~NodeTest() 
{
    std::vector<std::shared_ptr<NodeTest>> buffer;
    std::shared_ptr<NodeTest> cursor = next;

    while (cursor.use_count()!=0)
    {
        std::shared_ptr<NodeTest> temp = cursor->getNext();
        cursor->setNext(std::shared_ptr<NodeTest>());
        buffer.push_back(cursor);
        cursor = temp;
    }

    next = std::shared_ptr<NodeTest>();
};

最佳答案

在这种情况下,您应该手动管理节点删除,因为析构函数调用析构函数调用析构函数.....

看讲讲CppCon 2016: Herb Sutter “Leak-Freedom in C++... By Default.”

关于c++ - 将 shared_ptr 用于 linked_list 在析构函数中给出 stackoverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54809814/

相关文章:

c++ - 以下代码在并发情况下的可能结果是什么?

c++ - 如何将 char 数组转换为 uintmax_t?

c++ - 如何在 Python + SWIG 中接收引用和指针参数?

c# - 链表的应用 C++ vs C#

c# - 在将列表连接到列表框时获取 StackOverflowException

c# - 递归函数、堆栈溢出和 Y 组合器

c# - 如何防止和/或处理 StackOverflowException?

c# - 从非托管 C++ 调用 C# 代码?

algorithm - 排序双链表的搜索算法

java - 无法在 Java 中创建 7M Long 类型变量的 LinkedList