這個問題很有可能被重復,但我不確定如何對此進行適當的搜索。這對你來說可能是微不足道的,但它會幫助我作為一個初學者很多!
假設我有三個班級,每個班級都有一個容器
class A {
std::map<int, B> container1;
};
class B {
std::unordered_map<int, C> container2;
};
class C {
std::vector<int> container3;
};
如果我有一個從 A 類創建的物件“a”,其中 container1/2/3 都充滿了資料,我的問題如下:
- 當我呼叫 a.container1.clear() 時,分配給 container2 和 container3 的所有記憶體會被釋放嗎?如果是這樣,C 如何在幕后做到這一點?
- 當'a'的解構式被呼叫時,container2和3會被釋放嗎?
- 如果 1 和 2 為真,它們是否適用于容器的任何嵌套組合?例如這里我有 map->unordered_map->vector。不同的組合可以是矢量->無序映射->映射。
我的直覺是它們都是真的。否則,如果我有一個非常深的嵌套結構,那么一直到底部并顯式釋放那里的記憶體是沒有意義的。
uj5u.com熱心網友回復:
簡短的回答:是的,這種情況下的所有嵌套容器都將釋放它們的記憶體。
長答案:讓我們從頭開始作業。
首先,我將假設這些是結構而不是類(或者容器已被宣告為公共的);否則,a.container1.clear()將無法編譯,因為 container1 將是 a 的私有成員。但是,拋開這一點:
當你打電話時會發生什么a.container1.clear()?根據https://www.cplusplus.com/reference/map/map/clear/, clear 方法從容器中洗掉所有元素,并且這些元素被銷毀。
因此,這意味著a.container1 中的每個B 型別的物件都將被銷毀,即B 的解構式將被呼叫。
在 C 中,當一個類的物件被銷毀時,該類的解構式完成后呼叫該類的每個成員的解構式(在這種情況下,B 的解構式是默認的編譯器生成的解構式,因為沒有用戶提供的解構式是展示)。所以,B被銷毀后,會呼叫B.container2的解構式。由于 container2 是一個 unordered_map,它的解構式將銷毀其包含的所有元素(https://www.cplusplus.com/reference/unordered_map/unordered_map/~unordered_map/)
由于 container2 的元素是 C 型別,因此 container2 中的每個 C 型別元素都會呼叫其解構式。同樣,container3 的解構式將被呼叫。并且,作為向量,container3 的存盤容量將被釋放,即釋放(https://www.cplusplus.com/reference/vector/vector/~vector/)。
現在,我們已經走到了底部,我們已經看到所有記憶體都被釋放了!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/408780.html
標籤:
