2013-08-28 61 views
3

我缺少一些關於共享/弱指針構造被對象中刪除對於控制塊和對象本身)。當最後一個shared_ptr被破壞但是有weak_ptr -s剩下時會發生什麼?此時管理對象必須被釋放。但是如果make_shared分配的內存被釋放,那麼會使弱指針無效,因爲相同的釋放會破壞控制塊。C++ 11:當使用<code>shared_ptr</code><code>make_shared</code>構造</p> <p>,僅使用一個內存分配(分配內存:如何如果它是使用make_shared

+1

20.7.2.2.6/6:「備註:鼓勵實施*,但不要求*,執行不超過一個內存 分配。」 (Emphasis mine。) – cHao

回答

8

隨着make_sharedallocate_shared,只有一個單一的參考控制塊包含對象本身。它看起來像這樣:

struct internal_memory_type 
{ 
    unsigned char[sizeof T] buf; // make sure the object is at the top for 
            // efficient dereferencing! 
    // book keeping data 
} internal_memory; 

該對象在位構建:::new (internal_memory.buf) T(args...)

整個塊的內存分配爲::operator new,或allocate_shared與分配器的allocate()函數。

當不再需要該對象時,會在對象本身上調用析構函數,有些東西如internal_memory.buf->~T();。當不再需要參考控制塊時,即當所有弱參考消失以及所有強參考消失時,參考控制塊作爲整體通過::operator delete或用allocate_shared的分配器的deallocate()函數釋放。

+0

因此,當共享指針數量變爲零時,對象內存可能不會立即釋放,只調用析構函數? – user2052436

+0

@ user2052436:當然:-) –

+1

還有一個問題:這意味着如果存在一個弱指針循環,即使沒有共享指針,整個程序生命期間內存也會被佔用。 – user2052436

相關問題