我有一個類的方法,使一個特定實例的「主動」實例:演員「這個」到std :: shared_ptr的
void makeActive() { activeInstance = this; }
然而,由於activeInstance
不工作的類型爲std::shared_ptr<ClassName>
。我如何投this
到std::shared_ptr<ClassName>
?
我有一個類的方法,使一個特定實例的「主動」實例:演員「這個」到std :: shared_ptr的
void makeActive() { activeInstance = this; }
然而,由於activeInstance
不工作的類型爲std::shared_ptr<ClassName>
。我如何投this
到std::shared_ptr<ClassName>
?
如果你的對象已經被一個shared_ptr
擁有,你可以通過讓你的對象產生另一個shared_ptr
從std::enable_shared_from_this
繼承那麼這段代碼將工作:
void makeActive() { activeInstance = shared_from_this(); }
如果你的對象是尚未擁有由shared_ptr
,那麼你肯定不想在makeActive()
中創建一個,因爲shared_ptr
會嘗試刪除你的對象當最後一個被破壞時。
如果您的對象尚未由一個維護,您仍可以創建shared_ptr。看到我的答案。 –
@JohnZwinck我完全同意......你可以看到我很小心,不要說它*無法完成*。 –
你說過:「一個shared_ptr會在最後一個被銷燬時嘗試刪除你的對象」,但是如果你在我的答案中解釋了空刪除器,這是不正確的。說「你確定不想創造一個」是一個太強大的陳述,因爲可以安全地做到這一點。 –
這將 「工作」(見下文):
activeInstance.reset(this);
的問題是,這是什麼意思?當activeInstance
超出範圍時,this
將爲delete
d。這可能不是你想要的。你也應該閱讀有關enable_shared_from_this
,這樣可以讓你說:
activeInstance = shared_from_this();
另一種方法是使用「零缺失者」,也就是指定一個刪除器功能,什麼也不做:
void NoDelete(void*) {}
activeInstance.reset(this, NoDelete);
在很多情況下,這將是一個安全和正確的解決方案,假設this
將被別處的其他方法刪除,而不是在activeInstance
的最後解除引用之前刪除。
我很確定'activeInstance'是一個全局或靜態類成員,因此不會超出範圍。 –
@MikeDeSimone:那麼它將在程序退出時被銷燬,這可能仍然會導致雙重刪除,因此未定義的行爲。 –
或者使用別名構造函數而不是null刪除器:'activeInstance = std :: shared_ptr
[Create a boost :: shared \ _ptr to a existing variable](http://stackoverflow.com/questions/8466459/create-a-boostshared-ptr-to-an-existing-variable) – timrau
這使用'std :: shared_ptr',所以一些語義可能會有所不同。 –