当我们打电话时
delete[] array; // array is a pointer to an array
或
delete[] vector; // vector is a pointer to a vector
假设这些是链表头指针的数组/向量:这两个语句是否为它们中的每个项调用析构函数?或者我们应该遍历它们,删除每个项目,然后删除[]数组或向量本身?
让我更具体一点, 如果数组中包含一个带有析构函数的头指针,则会删除它的下一个节点或指向它。
答案 0 :(得分:6)
您的第二个代码段不正确。 delete
和delete[]
是两个不同的运营商。 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];
}
答案 1 :(得分:0)
删除一个指针数组delete []数组是合适的,但对于一个指针向量,我会使用这样的结构:
std::vector<Data*> m_data;
while(!m_data.empty()) delete m_data.back(), m_data.pop_back();
答案 2 :(得分:0)
在delete[]
上调用std::vector
不正确C ++。当向量超出范围时,或者当delete
指向它时,如果在new
的堆上分配,则会销毁该向量。但是,在这两种情况下,销毁数组/向量都不会在它包含的指针上调用delete
- 如果需要释放内存,则需要自己迭代并自己执行此操作。