我已经转换了以下链表结构
struct node {
node* next;
int v;
};
进入 c++11 版本 - 不使用指针。
struct node {
unique_ptr<node> next;
int v;
};
添加、删除元素和遍历工作正常,但是当我插入大约 100 万个元素时,调用头节点的析构函数时出现堆栈溢出。
我不确定我做错了什么。
{
node n;
... add 10mill elements
} <-- crash here
如其他答案中所述,由于递归隐式析构函数,您出现了段错误。可以在不诉诸原始指针的情况下解决这个问题,不必信任编译器或编写自定义分配器:
~node() {
for (std::unique_ptr<node> current = std::move(next);
current;
current = std::move(current->next));
}
在这里,您迭代地遍历指针链。这将一次一个地解开一个指针并将所有权 std::move(current->next)
更改为 current。同时,current
拥有的先前未链接的指针将被释放,同时被移动赋值覆盖。
您可能会发现显式变体更直接:
current.reset(current->next.release()));
实际上等同于:
current = std::move(current->next));
我更喜欢move
版本,因为它绝不会为您留下原始指针。但在那种情况下,它并没有什么不同。