一般來說,智能指針如std::unique_ptr
和Glib::RefPtr
在重新分配指向另一個對象時會刪除它們的對象,因爲它們是保存給定對象的唯一指針(顯然在std::unique_ptr
的情況下隱含)?重新分配智能指針
重新分配智能指針
回答
對於unique_ptr::reset
,[unique.ptr.single.modifiers]/4:
影響:分配
p
所存儲的指針,然後如果所存儲的指針,old_p
的舊值,不等於nullptr
,請致電get_deleter()(old_p)
。在[unique.ptr.single.asgn]/2
或者移動賦值運算符,operator=(unique_ptr&& u)
:
轉會所有權從
u
到*this
彷彿通過調用reset(u.release())
隨後get_deleter() = std::forward<D>(u.get_deleter())
。
(等效爲其他賦值運算符模板)
對於
shared_ptr
,調動是有一點點不同。
shared_ptr
永遠不會銷燬一個被引用的對象,因爲它不是最後一個擁有它的對象,所以讓我們假設這是給定的。
shared_ptr::reset(Y*)
指定在[util.smartptr.shared.mod]/3:
影響:等價於
shared_ptr(p).swap(*this)
。
但是很明顯,臨時函數在函數調用結束時被破壞,破壞了保持對象(如果適用)。
即相同的行爲operator=(shared_ptr<> const&)
具有[util.smartptr.shared.assign]/1和4:
影響:等價於
shared_ptr(r).swap(*this)
。
...移動賦值運算符(模板),r
是shared_ptr<>&&
:
影響:等價於
shared_ptr(std::move(r)).swap(*this)
。
如果*this
是最後擁有的對象,那麼現在臨時是 - 將被銷燬。
對於Glib::RefPtr
的情況類似於shared_ptr
:副本賦值運算符(和賦值運算符模板)與相同的語義定義。如果當前的RefPtr
被分配給其他值,則當前保持對象引用計數器遞減並且如果結果計數器值爲零則將其銷燬。
對於unique_ptr答案是肯定的:
的對象被破壞,當任一 之後發生開發它的內存釋放:
- 的unique_ptr管理對象被銷燬
- unique_ptr通過operator =或reset()指定管理對象的另一個指針。
的目的是使用一種潛在的用戶提供的刪除器通過調用 刪除器(PTR)破壞。刪除者調用對象 的析構函數並分配內存。
- 1. VTK智能指針新()
- 2. 在重新分配指針後使用類指針功能
- 3. 與智能指針動態分配多重數組
- 4. C++智能指針
- 5. 與智能指針
- 6. Boost智能指針
- 7. python指針內存重新分配
- 8. 重新分配一個指針?
- 9. 困惑這些指針重新分配
- 10. 在descructor中重新分配指針
- 11. Boost智能指針和std智能指針有什麼區別?
- 12. 智能指針在智能指針管理數組內
- 13. C++ - 智能指針 - 在模板中投射智能指針
- 14. 重寫這個智能指針
- 15. 雙指針和重新分配空指針
- 16. 將指針傳遞給指針並重新分配空間
- 17. 指針指針和重新分配在C
- 18. 使用參考更新智能指針
- 19. 智能指針代替指針
- 20. 指針和智能指針的區別
- 21. 虛空指針到智能指針
- 22. 智能指針和參數列表分配規則
- 23. 在條件或循環中分配智能指針
- 24. 智能指針 - 的unique_ptr的堆棧分配的變量
- 25. 是否將智能指針分配給_variant_t需要手動AddRef()?
- 26. 智能指針和自定義內存分配困境
- 27. 正在重新分配的指針未被分配
- 28. 正在重新分配的指針未被分配
- 29. COM智能指針如何重置爲新實例?
- 30. 從新分配更改爲智能指針後發生堆錯誤
RefPtr something = getSomething(); something = getSomethingElse();工作正常。你不需要使用RefPtr :: swap()。當然,這裏的重新分配只是減少了第一個東西的引用,而不是刪除它。它是一個引用計數_shared_智能指針。 –
murrayc
2014-12-07 19:18:04
@murrayc我第一次閱讀時必須誤讀文檔。謝謝! – Columbo 2014-12-07 19:44:27