我缺少一些關於共享/弱指針構造被對象中刪除對於控制塊和對象本身)。當最後一個shared_ptr
被破壞但是有weak_ptr
-s剩下時會發生什麼?此時管理對象必須被釋放。但是如果make_shared
分配的內存被釋放,那麼會使弱指針無效,因爲相同的釋放會破壞控制塊。C++ 11:當使用<code>shared_ptr</code><code>make_shared</code>構造</p> <p>,僅使用一個內存分配(分配內存:如何如果它是使用make_shared
回答
隨着make_shared
和allocate_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()
函數釋放。
因此,當共享指針數量變爲零時,對象內存可能不會立即釋放,只調用析構函數? – user2052436
@ user2052436:當然:-) –
還有一個問題:這意味着如果存在一個弱指針循環,即使沒有共享指針,整個程序生命期間內存也會被佔用。 – user2052436
- 1. C++ multimap <int,vector <string>>內存分配問題
- 2. 如何使用ItemsControl分配<DataGrid.Columns>?
- 3. 如何CPU從內存?緩存如何發揮<p>我已經寫了一張我在哪裏分配內存變量Bextradata代碼(這是結構的構件也被分配使用malloc)作爲</p> <pre><code>Bextradata = (U8_WMC *) malloc(Size); memset(Bextradata, 0,Size); memcpy(BextraData,pdata + 18,Size); </code></pre> 重要作用
- 4. 如何使用make_shared <T>()替換所有shared_ptr <T>(new_w <T>)?
- 5. 如何動態地分配內存到Vector <Point>?
- 6. 在apply()中分配變量 - 使用<< -
- 7. 使用MemoryStream分配內存
- 8. 使用mmap分配內存
- 9. 使用calloc分配內存
- 10. 使用malloc()分配內存
- 11. 使用AWE分配內存
- 12. 在C++中用void *分配內存結構內存分配
- 13. 分配`null`值可空<DateTime>使用單線「如果」
- 14. 如何區分分配使用一個內存池
- 15. 如何分析windbg中的<未分類>內存使用情況
- 16. C++向量的內存分配<bool>
- 17. 如何使用unique_ptr自動管理向量的內存<vector<int>>
- 18. 如何分配內存使用C++而不是C malloc
- 19. 如何分配使用內嵌分配
- 20. 如何使用XSLT匹配<titlealts>?
- 21. 構造函數調用分配內存?
- 22. 使用指向其結構或結構本身的指針來分配內存會更好嗎?</p> <pre><code>Date *ptrdate = malloc(12 * sizeof(*ptrdate)); </code></pre> <p><strong>問:</strong>哪一個更好,爲什麼
- 23. 構造函數不能使用make_shared <T>()
- 24. 動態內存分配和使用C
- 25. 如何使用的cout << MyClass的
- 26. 使用<< END
- 27. 爲向量分配內存<vector<>>簡短的方式
- 28. 什麼是和如何使用'<<< END_JAVASCRIPT'字符串?
- 29. 如何使用<p:ajax>內部<p:tree>的primefaces?
- 30. 如何在<ui:composition>標記內使用<f:loadBundle>標記
20.7.2.2.6/6:「備註:鼓勵實施*,但不要求*,執行不超過一個內存 分配。」 (Emphasis mine。) – cHao