Следующий код компилируется и работает нормально:
#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, создают обратную линию, которая имеет глубину тысяч. Таким образом, я думаю, что segfault из-за нехватки места в стеке из вызовов функций. У меня два вопроса. Во-первых, это правильная оценка segfault? Во-вторых, если это так, есть хороший способ управлять настраиваемыми структурами данных, такими как деревья, которые нужно собрать мусором, но может быть чрезвычайно большим. Спасибо.