[英]What happens when I clear a vector of struct?
memory 管理問題在這里。
我得到了一個結構Test1
的vector
,這個結構包含一個map
。 在我的程序中,函數將使用本地創建的地圖在本地創建Test1
。
考慮以下代碼:
#include <map>
#include <vector>
struct Vec3 {
float x, y, z;
};
struct Test1 {
int64_t a;
std::map<int, Vec3> mapy;
};
std::vector<Test1> global;
void ClearGlobal() {
global.clear();
}
void AddToGlobal() {
Vec3 test = { 1, 2, 3 };
std::map<int, Vec3> mapy;
mapy[1] = test;
global.push_back({ 10, mapy });
}
void main() {
AddToGlobal();
ClearGlobal();
}
我想知道當我清除那個向量時會發生什么? 所有結構都會從 memory 中釋放出來嗎?
我想知道當我清除那個向量時會發生什么?
根據文檔,元素被刪除。
所有結構都會從 memory 中釋放出來嗎?
向量的容量不變。
簡短回答: Test1
的mapy
字段的 memory 將被釋放,但結構本身的 memory 仍然存在。
長答案:
清除向量會調用向量內對象的析構函數,但不會釋放對象。 這是來自cppreference的片段:
保持向量的容量()不變
這意味着sizeof(Test1)
大小的capacity()
元素不會被釋放。 但是由於調用了析構函數,所以破壞了mapy
等內部字段。 由於mapy
在堆上擁有一些 memory,它的銷毀釋放了 memory。 結果,指向Test1
Test1
所有memory都被釋放。
請注意,這種釋放僅由於內部字段的析構函數而發生。 如果您的結構包含指向 memory 塊的原始指針,並且如果Test1::~Test1
沒有明確刪除它,則在調用clear()
后不會釋放 memory 塊。 這可能會導致 memory 泄漏。
編輯:看到另一個答案,我想強調,在clear()
之后,沒有任何元素是有效的,即使沒有一個元素被釋放。 除了通過重新創建向量中的元素的方法(例如push_back
、 emplace_back
、 resize
和insert
)之外,您不應該讀取或寫入它們。 在調用clear()
之后對元素的任何其他訪問都是未定義的行為,這可能導致奇怪和不可預測的程序行為(主要是由於破壞了代碼不依賴於未定義行為的假設而使編譯器混淆)。 永遠不要依賴未定義的行為。 永遠不要故意調用未定義的行為,即使這在今天“似乎有效”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.