2014-12-04 51 views
7

一般來說,智能指針如std::unique_ptrGlib::RefPtr在重新分配指向另一個對象時會刪除它們的對象,因爲它們是保存給定對象的唯一指針(顯然在std::unique_ptr的情況下隱含)?重新分配智能指針

回答

9

對於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)

...移動賦值運算符(模板),rshared_ptr<>&&

影響:等價於shared_ptr(std::move(r)).swap(*this)

如果*this是最後擁有的對象,那麼現在臨時是 - 將被銷燬。


對於Glib::RefPtr的情況類似於shared_ptr:副本賦值運算符(和賦值運算符模板)與相同的語義定義。如果當前的RefPtr被分配給其他值,則當前保持對象引用計數器遞減並且如果結果計數器值爲零則將其銷燬。

+0

RefPtr something = getSomething(); something = getSomethingElse();工作正常。你不需要使用RefPtr :: swap()。當然,這裏的重新分配只是減少了第一個東西的引用,而不是刪除它。它是一個引用計數_shared_智能指針。 – murrayc 2014-12-07 19:18:04

+0

@murrayc我第一次閱讀時必須誤讀文檔。謝謝! – Columbo 2014-12-07 19:44:27

3

對於unique_ptr答案是肯定的:

對象被破壞,當任一 之後發生開發它的內存釋放:

  • 的unique_ptr管理對象被銷燬
  • unique_ptr通過operator =或reset()指定管理對象的另一個指針。

的目的是使用一種潛在的用戶提供的刪除器通過調用 刪除器(PTR)破壞。刪除者調用對象 的析構函數並分配內存。