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

Rim*_*oun 2 c++ memory-leaks memory-management

当我们打电话

delete[] array; // array is a pointer to an array
Run Code Online (Sandbox Code Playgroud)

要么

delete[] vector; // vector is a pointer to a vector
Run Code Online (Sandbox Code Playgroud)

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

让我更具体一点,如果数组中包含一个带有析构函数的头指针,则会删除它的下一个节点或指向它.

son*_*ing 6

您的第二个代码段不正确.delete并且delete[]是两个不同的运营商.delete用于删除由其创建的实例new,delete[]用于删除由其创建的元素数组new[].

在C++中,数组和向量并不关心它们存储的内容.对于数组和向量,您需要在删除数组和向量之前删除每个项(如果它们已分配使用new).

如果你像这样创建数组

Sample* arr[100];
for (int i = 0; i < 100; ++i) {
    arr[i] = new Sample();
}
Run Code Online (Sandbox Code Playgroud)

你需要像这样删除它们

for (int i = 0; i < 100; ++i) {
    delete arr[i];
}
Run Code Online (Sandbox Code Playgroud)

如果你创建这样的矢量

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

你需要像这样删除

for (int i = 0; i < 100; ++i) {
    delete arr[i];
}
Run Code Online (Sandbox Code Playgroud)