c++ - unique_ptr 链表的堆栈溢出

标签 c++ c++11 linked-list stack-overflow unique-ptr

<分区>

我已经转换了以下链表结构

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 版本,因为它绝不会为您留下原始指针。但在那种情况下,它并没有什么不同。

关于c++ - unique_ptr 链表的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35535312/

相关文章:

c++ - 如何在我的程序中添加类似 QTCreator 的左栏?

c++ - C++11 中的别名结构

在我的链表代码中找不到错误

java - Java中的队列/链表序列化

java - 我将如何使用线性插值和链接列表制作颜色渐变?

c++ - 在 C 或 C++ 中取消引用数组时使用小数参数

c++ - C++ 中 const 变量成员有什么用?

c++ - 缩短条件以检查 x 是否不是四个数字中的任何一个

c++ - 如何在我的 Boost::asio tcp 服务器刚开始运行时启动 "event"(AKA io_service.run())?

c++ - 现代 C++ 中的类型删除分配器