繁体   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