簡體   English   中英

當我清除一個結構向量時會發生什么?

[英]What happens when I clear a vector of struct?

memory 管理問題在這里。

我得到了一個結構Test1vector ,這個結構包含一個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 中釋放出來嗎?

向量的容量不變。

簡短回答Test1mapy字段的 memory 將被釋放,但結構本身的 memory 仍然存在。

長答案

清除向量會調用向量內對象的析構函數,但不會釋放對象。 這是來自cppreference的片段:

保持向量的容量()不變

這意味着sizeof(Test1)大小的capacity()元素不會被釋放。 但是由於調用了析構函數,所以破壞了mapy等內部字段。 由於mapy在堆上擁有一些 memory,它的銷毀釋放了 memory。 結果,指向Test1 Test1所有memory都被釋放。

請注意,這種釋放僅由於內部字段的析構函數而發生。 如果您的結構包含指向 memory 塊的原始指針,並且如果Test1::~Test1沒有明確刪除它,則在調用clear()后不會釋放 memory 塊。 這可能會導致 memory 泄漏。

編輯:看到另一個答案,我想強調,在clear()之后,沒有任何元素是有效的,即使沒有一個元素被釋放。 除了通過重新創建向量中的元素的方法(例如push_backemplace_backresizeinsert )之外,您不應該讀取或寫入它們。 在調用clear()之后對元素的任何其他訪問都是未定義的行為,這可能導致奇怪和不可預測的程序行為(主要是由於破壞了代碼不依賴於未定義行為的假設而使編譯器混淆)。 永遠不要依賴未定義的行為。 永遠不要故意調用未定義的行為,即使這在今天“似乎有效”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM