2017-03-27 170 views
1

我想創建shared_from_this函數與此共享ptr。shared_from_this派生類

#include <iostream> 
#include <memory> 

class foo { 
public: 
    virtual void method() { 
     std::cerr << "foo::method()" << std::endl; 
    } 
}; 

class foo_derived : public foo, public std::enable_shared_from_this<foo> { 
public: 
    void method() override { 
     auto self(shared_from_this()); 
     std::cerr << "foo_derived::method" << std::endl; 
    } 
}; 

int main() { 
    foo_derived().method(); 
} 

此代碼扔bad_weak_ptr從線auto self(shared_from_this()); 我認爲這個問題是與自己在派生類中創建的事實。 我正在尋找這種行爲的解釋,也將讚賞派生類的有效shared_from_this使用的一個例子。

回答

2

它與繼承無關。呼叫method這種方式,而不是將工作:std::make_shared<foo_derived>()->method();

cppreference std::enable_shared_from_this::shared_from_this

它允許調用shared_from_this 只對以前共享 對象,即通過的std :: shared_ptr的管理的對象。否則, 行爲是未定義的(直到C++ 17)std :: bad_weak_ptr被拋出(由 shared_ptr構造函數從默認構造的weak_this)(因爲 C++ 17)。