以下代码编译并运行良好:
#include <memory>
struct MyTree {
std::shared_ptr <MyTree> left;
std::shared_ptr <MyTree> right;
int val;
MyTree(
std::shared_ptr <MyTree> left_,
std::shared_ptr <MyTree> right_,
int val_
) : left(left_), right(right_), val(val_) {};
};
int main() {
std::shared_ptr <MyTree> t(
new MyTree( std::shared_ptr <MyTree>(),
std::shared_ptr <MyTree>(),
0)
);
for(int i=0;i<10000;i++) {
t.reset(new MyTree(t,t,0));
}
}
但是,当 for 循环从 10000 更改为 100000 时,我收到一个段错误。查看 gdb 中的结果,看起来由于 std::shared_ptr 中的垃圾收集而调用的析构函数创建了数千深的回溯。因此,我认为段错误是由于函数调用的堆栈空间不足。我有两个问题。首先,这是对段错误的正确评估吗?其次,如果是这样,是否有管理自定义数据结构的好方法,例如需要进行垃圾收集但可能非常大的树。谢谢。