簡體   English   中英

使用 shared_ptr 崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM