gpt4 book ai didi

c++ - 使用 shared_ptr 崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:23 24 4
gpt4 key购买 nike

有人可以向我解释为什么这里会崩溃吗?

#include <memory>
#include <functional>

struct Teacher : std::enable_shared_from_this<Teacher> {
struct Timetable;
std::shared_ptr<Timetable> timetable;
Teacher (int n) : timetable(std::make_shared<Timetable>(*this, n)) {}
};

struct Period {
std::shared_ptr<Teacher> teacher;
Period (const std::shared_ptr<Teacher>& t) : teacher(t) {}
};

struct Teacher::Timetable {
Teacher& teacher;
std::shared_ptr<Period> homeForm;
Timetable (Teacher& t, int n) : teacher(t), // Assume something is done with n.
homeForm( std::make_shared<Period>(teacher.shared_from_this()) ) {} // Crashes.
// homeForm( std::make_shared<Period>(std::shared_ptr<Teacher>(&teacher)) ) {} // Also crashes.
};

int main() {
std::shared_ptr<Teacher> teacher = std::make_shared<Teacher>(3);
}

不是 teacher.shared_from_this()std::shared_ptr<Teacher> teacher 以来允许此处已经是 shared_ptr 了吗?如果没有,我该如何初始化 homeForm合适吗?

最佳答案

问题是您的代码调用了 shared_from_thisstd::shared_ptr<Teacher> 之前已完全建成。 Teacher 在某种程度上是有道理的必须在智能指针完全构造之前构造子对象。

如果你这样修改代码,

struct Teacher : std::enable_shared_from_this<Teacher> {
struct Timetable;
std::shared_ptr<Timetable> timetable;
Teacher() {}
void init(int n) { this->timetable = std::make_shared<Timetable>(*this, n); }
};

// Everything else unchanged

int main() {
std::shared_ptr<Teacher> teacher = std::make_shared<Teacher>();
teacher->init(3);
}

它会正常运行。

请注意,我不建议将此作为重构。构造函数应尽可能完全初始化对象。看看你的代码,在我看来你可能想要考虑更激进地重新构建它。您真的需要所有这些交叉引用共享指针吗?

关于c++ - 使用 shared_ptr 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35832798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com