c++ - 添加到 vector 的 std::shared_ptr 会导致段错误

标签 c++ vector c++14 shared-ptr

我有这个示例程序。我想做的就是在 vector 本身包含的对象之间共享 vector 实例,以便它们可以从容器中进行操作(添加其他对象,删除自身)。

#include <iostream>
#include <memory>
#include <vector>

class SimpleClass {
private:
  std::shared_ptr<std::vector<SimpleClass>> objects;

public:
  SimpleClass (std::shared_ptr<std::vector<SimpleClass>> _objects): objects { _objects } {}

  void grow () {
    std::cout << "growing" << std::endl;
    for (int i { 0 }; i < 10; ++i) {
      std::cout << "about to add a new object" << std::endl;
      std::cout << "current simple_objects size: " << objects->size() << std::endl;
      objects->push_back(SimpleClass(objects));
      std::cout << "added a new object" << std::endl;
    }
  }
};

int main () {
  auto simple_objects = std::make_shared<std::vector<SimpleClass>>();

  for (int i { 0 }; i < 10; ++i) {
    simple_objects->push_back(SimpleClass { simple_objects });
  }

  std::cout << "simple_objects size: " << simple_objects->size() << std::endl;

  for (auto &obj: *simple_objects) {
    obj.grow();
  }

  return 0;
}

经过一些迭代后,程序出现段错误 11:

simple_objects size: 10
growing
about to add a new object
current simple_objects size: 10
added a new object
about to add a new object
current simple_objects size: 11
added a new object
about to add a new object
current simple_objects size: 12
added a new object
about to add a new object
current simple_objects size: 13
added a new object
about to add a new object
current simple_objects size: 14
added a new object
about to add a new object
current simple_objects size: 15
added a new object
about to add a new object
current simple_objects size: 16
added a new object
about to add a new object
Segmentation fault: 11

可以在这里测试该程序:https://www.onlinegdb.com/rJHSik8Hf

什么原因导致段错误以及如何预防?

最佳答案

问题是您在仍在使用类时重新分配(复制/移动)该类。

我猜 vector 分配了 16 个槽。现在您想要添加第 17 项。这意味着 vector 需要分配更大的数组并复制/移动现有项。

这可行,但请考虑当前项目(this)。它在旧阵列中。它被移动/复制,旧数组被销毁。所以现在这指向您刚刚释放的内存并且您会遇到段错误(幸运的是)。

您可能想要的是调整 vector 大小不会更改项目。您可以将这些项目包装在 std::unique_ptr 中,它会正常工作。

其他替代方法是固定数组的大小,这样就不会调整大小,或者不从数组中的对象修改数组。

关于c++ - 添加到 vector 的 std::shared_ptr 会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48421222/

相关文章:

c++ - 从 vector< char > 转换为字符串数组

C++ vector 初始化

c++ - 如何使用 C++ 在 sqlite3 中打开受密码保护的数据库?

c++ - c++ 对象数组的延迟分配

C++ boost ublas + units 维数约束

ruby - 面向对象的 Ruby 中的向量加法

c++ - 将带有 unique_ptr 的可变 lambda 传递给 const& std::function

使用模板的 C++ 惰性求值

c++ - 如何有条件地使用 boost MPL 添加?

c++ - 有没有用 Luabridge 向 Lua 公开 sf::Event 的好方法?