我正在尝试使用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
答案 0 :(得分:1)
在这种情况下,您应该管理手动删除的节点,因为析构函数调用析构函数调用析构函数.....
看看谈话CppCon 2016: Herb Sutter “Leak-Freedom in C++... By Default.”
答案 1 :(得分:0)
NodeTest
的析构函数调用NodeTest::next
的析构函数,后者递归地调用另一个NodeTest
析构函数,依此类推,直到堆栈耗尽。因此,不应将智能指针用于链接节点。