删除指针数组与删除指针向量

Deleting an array of pointers vs deleting a vector of pointers

本文关键字:删除 指针 向量 数组      更新时间:2023-10-16

当我们调用时

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

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

假设这些是链表头指针的数组/向量:这两个语句是否调用其中每个项目的析构函数?或者我们应该遍历它们,删除每个项目,然后删除数组或向量本身?

让我更具体地说,如果数组持有一个头指针,并调用其析构函数,则会删除其下一个节点或指向的节点。

您的第二个代码片段不正确。 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++。当向量超出范围时,或者当您delete指向它的指针(如果使用 new 在堆上分配(时,该向量将被销毁。但是,在这两种情况下,销毁数组/向量都不会在其包含的指针上调用delete - 如果您需要释放该内存,则需要遍历并自己执行此操作。