如何使用 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" 错误。
所以
- 在
for (A *child: A) { delete child; ...
中,您可能应该遍历 children
,而不是 A
。
- 要使上述工作正常,您应该将 children 存储在
std::vector
中,而不是原始数组 (std::vector<A> children
)。
- 使用您选择的 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
的引用,而不是复印件。所以当你赋值给它时,它会修改数组。
所以我基本上想这样做:
struct A {
A *children[10];
};
但是,当我这样做并创建一个析构函数时,例如:
virtual ~A() {
for (A *child: children) {
delete child;
}
}
我遇到了分段错误,我不确定为什么。那么,如何使用 STL class 完成在 A 中保存 A 的列表,这样我就不必担心 new/delete?我尝试了 vector 并得到了 "incomplete type" 错误。
所以
- 在
for (A *child: A) { delete child; ...
中,您可能应该遍历children
,而不是A
。 - 要使上述工作正常,您应该将 children 存储在
std::vector
中,而不是原始数组 (std::vector<A> children
)。 - 使用您选择的 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
的引用,而不是复印件。所以当你赋值给它时,它会修改数组。