对shared_list使用shared_ptr可以在析构函数内产生stackoverflow

时间:2019-02-21 14:48:19

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

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

4294967295

由于调用begin counter <= counter + 1; led <= ( counter == 20'b00000000000000000000 ) ? ~led: led; end 析构函数(RAII),因此在离开#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(); } 范围时,这会产生堆栈溢出。要销毁test_destroy(),它调用aList的析构函数,依此类推,显然,对于足够大的列表,它最终会产生stackoverflow。

我找不到解决此问题的有效方法。理想的情况是先删除当前的aList,然后再删除next,对吗?你会怎么做?

预先感谢

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

NodeTest

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

NodeTest的析构函数调用NodeTest::next的析构函数,后者递归地调用另一个NodeTest析构函数,依此类推,直到堆栈耗尽。因此,不应将智能指针用于链接节点。