如何使用 STL containers/smart 指针让 class 保存其自身的数组?

How do I have a class hold an array of itself by using STL containers/smart pointers?

所以我基本上想这样做:

struct A {

    A *children[10];
};

但是,当我这样做并创建一个析构函数时,例如:

 virtual ~A() {
        for (A *child: children) {
            delete child;
        }
    }

我遇到了分段错误,我不确定为什么。那么,如何使用 STL class 完成在 A 中保存 A 的列表,这样我就不必担心 new/delete?我尝试了 vector 并得到了 "incomplete type" 错误。

所以

  1. for (A *child: A) { delete child; ... 中,您可能应该遍历 children,而不是 A
  2. 要使上述工作正常,您应该将 children 存储在 std::vector 中,而不是原始数组 (std::vector<A> children)。
  3. 使用您选择的 smart pointer(例如 std::shared_ptr)而不是原始指针,这样您就不必删除任何内容。

这个:

for (shared_ptr<A> child: a.get()->children) {

不迭代 children -- 它迭代 副本 children 中的指针。因此,在每次迭代中,您都会复制(空)共享指针(child),然后将该循环本地副本设置为新分配的对象,然后 child 超出范围并且分配的对象被释放。 children 数组中的指针从未被修改。

你想要的是:

for (shared_ptr<A> &child: a.get()->children) {

显式引用 (&) 意味着在循环的每次迭代中,child 将是对 children 数组中的 shared_ptr 的引用,而不是复印件。所以当你赋值给它时,它会修改数组。