次のコードは正常にコンパイルおよび実行されます。
#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 に変更すると、segfault が発生します。gdb の結果を見ると、std::shared_ptr のガベージ コレクションの結果としてデストラクタが呼び出され、数千の深さのバックトレースが作成されているようです。そのため、セグメンテーション違反は、関数呼び出しからスタック上のスペースが不足しているためだと思います。2つ質問があります。まず、これはセグメンテーション違反の正しい評価ですか? 第二に、もしそうなら、ガベージコレクションが必要であるが非常に大きくなる可能性があるツリーなどのカスタムデータ構造を管理する良い方法はありますか. ありがとう。