2015-01-12 35 views
9

我有一個類的方法,使一個特定實例的「主動」實例:演員「這個」到std :: shared_ptr的

void makeActive() { activeInstance = this; } 

然而,由於activeInstance不工作的類型爲std::shared_ptr<ClassName>。我如何投thisstd::shared_ptr<ClassName>

+0

[Create a boost :: shared \ _ptr to a existing variable](http://stackoverflow.com/questions/8466459/create-a-boostshared-ptr-to-an-existing-variable) – timrau

+2

這使用'std :: shared_ptr',所以一些語義可能會有所不同。 –

回答

22

如果你的對象已經被一個shared_ptr擁有,你可以通過讓你的對象產生另一個shared_ptrstd::enable_shared_from_this

繼承那麼這段代碼將工作:

void makeActive() { activeInstance = shared_from_this(); } 

如果你的對象是尚未擁有shared_ptr,那麼你肯定不想在makeActive()中創建一個,因爲shared_ptr會嘗試刪除你的對象當最後一個被破壞時。

+0

如果您的對象尚未由一個維護,您仍可以創建shared_ptr。看到我的答案。 –

+0

@JohnZwinck我完全同意......你可以看到我很小心,不要說它*無法完成*。 –

+2

你說過:「一個shared_ptr會在最後一個被銷燬時嘗試刪除你的對象」,但是如果你在我的答案中解釋了空刪除器,這是不正確的。說「你確定不想創造一個」是一個太強大的陳述,因爲可以安全地做到這一點。 –

3

這將 「工作」(見下文):

activeInstance.reset(this); 

的問題是,這是什麼意思?當activeInstance超出範圍時,this將爲delete d。這可能不是你想要的。你也應該閱讀有關enable_shared_from_this,這樣可以讓你說:

activeInstance = shared_from_this(); 

另一種方法是使用「零缺失者」,也就是指定一個刪除器功能,什麼也不做:

void NoDelete(void*) {} 

activeInstance.reset(this, NoDelete); 

在很多情況下,這將是一個安全和正確的解決方案,假設this將被別處的其他方法刪除,而不是在activeInstance的最後解除引用之前刪除。

+0

我很確定'activeInstance'是一個全局或靜態類成員,因此不會超出範圍。 –

+1

@MikeDeSimone:那麼它將在程序退出時被銷燬,這可能仍然會導致雙重刪除,因此未定義的行爲。 –

+4

或者使用別名構造函數而不是null刪除器:'activeInstance = std :: shared_ptr (std :: shared_ptr (),this);' –

相關問題