簡體   English   中英

刪除指針數組與刪除指針向量

[英]Deleting an array of pointers vs deleting a vector of pointers

當我們打電話

delete[] array; // array is a pointer to an array

要么

delete[] vector; // vector is a pointer to a vector

假設它們是鏈接列表頭指針的數組/向量:這2條語句是否為它們中的每一項調用析構函數? 還是我們應該遍歷它們,刪除每個項目,然后delete []數組或向量本身?

讓我更具體一點,如果該數組持有帶有其析構函數的頭指針,則該數組將刪除其下一個節點或它指向的節點。

您的第二個代碼段不正確。 deletedelete[]是兩個不同的運算符。 delete用於刪除new創建的實例, delete[]用於刪除new[]創建的元素數組。

在C ++中,數組和向量不關心它們存儲的內容。 對於數組和向量,都需要先刪除每個項目(如果它們是使用new分配的),然后再刪除數組和向量。

如果您這樣創建數組

Sample* arr[100];
for (int i = 0; i < 100; ++i) {
    arr[i] = new Sample();
}

您需要像這樣刪除它們

for (int i = 0; i < 100; ++i) {
    delete arr[i];
}

如果創建這樣的向量

vector<Sample*> arr;
for (int i = 0; i < 100; ++i) {
    arr.push_back(new Sample());
}

您需要這樣刪除

for (int i = 0; i < 100; ++i) {
    delete arr[i];
}

刪除指針數組delete []數組是合適的,但是對於指針向量,我將使用如下結構:

std::vector<Data*> m_data;
while(!m_data.empty()) delete m_data.back(), m_data.pop_back();

std::vector上調用delete[]是不正確的C ++。 當向量超出范圍時,或者如果使用new分配指向堆的指針delete指針,則向量將被破壞。 在這兩種情況下,但是,破壞了陣列/矢量不調用delete它包含指針-你需要的,如果你需要釋放該內存遍歷和自己做。

暫無
暫無

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

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