【问题标题】:Deleting an array of pointers vs deleting a vector of pointers删除指针数组与删除指针向量
【发布时间】:2015-08-09 04:00:19
【问题描述】:

当我们打电话时

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

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

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

让我更具体一点, 如果数组包含一个头指针,其析构函数被调用,它将删除其下一个节点或它指向的节点。

【问题讨论】:

  • 你没有删除带有delete[]的向量

标签: c++ memory-management memory-leaks


【解决方案1】:

您的第二个代码 sn-p 不正确。 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];
}

【讨论】:

    【解决方案2】:

    删除指针数组 delete[] 数组是合适的,但对于指针向量我会使用这样的构造:

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

    【讨论】:

      【解决方案3】:

      std::vector 上调用 delete[] 不是正确的 C++。当向量超出范围或delete 使用new 在堆上分配指向它的指针时,该向量将被销毁。然而,在这两种情况下,销毁数组/向量不会在其包含的指针上调用 delete - 如果您需要释放该内存,您需要遍历并自己执行此操作。

      【讨论】:

        猜你喜欢
        • 2013-09-24
        • 2012-08-12
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        相关资源
        最近更新 更多