[英]Crash with shared_ptr
有人可以向我解釋為什么這里崩潰嗎?
#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);
}
由於std::shared_ptr<Teacher> teacher
已經是 shared_ptr ,因此這里是否允許teacher.shared_from_this()
? 如果沒有,我該如何正確初始化homeForm
?
問題是您的代碼在std::shared_ptr<Teacher>
完全構造之前調用了shared_from_this
。 在完全構造智能指針之前必須構造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);
}
它會運行良好。
請注意,我不建議將此作為重構。 構造函數應盡可能完全初始化對象。 看看你的代碼,在我看來你可能想要考慮更激進地重新構建它。 你真的需要所有這些交叉引用共享指針嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.