2014-09-25 96 views
5

我正在學習C++ 11的功能,特別是shared_ptr,並且我在提及this時遇到問題,並將其用作其他類的參考。將「this」引用爲shared_ptr?

這樣做的原因是我有一個Simulation實例被傳遞給模擬中的其他實例(例如Apple),因此他們可以自己修改模擬,甚至從模擬中刪除自己。

在我的更復雜的代碼中,我得到一個double free錯誤(當程序存在時),據我瞭解from here我不應該在同一個原始對象上創建兩次shared_ptr。當模擬類不知道this已經是shared_ptr時,我如何將this作爲shared_ptr傳遞給Apple對象?

我的想法是通過在初始化參數的shared_ptr但這似乎是多餘的,例如:

// The argument is a std::shared_ptr<Simulation> 
simulation->initSomethingElse(simulation); 

也許我想在一個不尋常的方式來實現這一點,也許我的理解是不完全正確?也許有更好的方法來做到這一點呢?

下面我有一個簡單的例子:

#include <memory> 

class Simulation; 

class Apple { 
public: 
    void init(std::shared_ptr<Simulation> simulation) { 
     this->simulation = simulation; 
    }; 

private: 
    std::shared_ptr<Simulation> simulation; 

}; 


class Simulation { 
public: 
    void initSomethingElse() { 
     auto apple = std::shared_ptr<Apple>(new Apple()); 

     // incorrect second reference to the raw pointer 
     apple->init(std::shared_ptr<Simulation>(this)); 
    }; 
}; 


int main() { 

    auto simulation = std::shared_ptr<Simulation>(new Simulation()); 
    simulation->initSomethingElse(); 

    return 0; 
} 
+0

你在哪裏銷燬'shared_ptr '實例? – Dai 2014-09-25 04:21:54

回答

8

,想到的第一件事就是用enable_shared_from_thishttp://en.cppreference.com/w/cpp/memory/enable_shared_from_this

但我想到的第二件事情是,仿真應該管理蘋果的壽命,所以蘋果不需要管理生命週期的模擬。因此,最好讓蘋果不要持有shared_ptr<Simulation> - 只有main()或某些高級功能應該管理模擬的生命週期。

如果你不小心,你會最終得到循環引用。不要假設C++ 11中的每個指針都應該是shared_ptr。

+0

僅爲最後一句 – James 2014-09-25 20:39:46

1

使用enable_shared_from_this所以對象的功能,可以創建一個新的shared_ptr本身。您需要執行此操作,而不是apple->init(std::shared_ptr<Simulation>(this));行,該行會創建第二個shared_ptrSimulation。您還需要在某處修改或保存appleshared_ptr,因爲目前只有Apple存在,而initSomethingElse()正在運行,這似乎不是很有用......?

相關問題