删除指针数组

时间:2014-02-12 15:17:10

标签: c++ arrays pointers delete-operator

delete[] a,其中a是动态分配的指针数组,是否为数组中的每个指针执行delete

我想,它会为具有用户定义类的数组执行析构函数,但是指针会发生什么?

6 个答案:

答案 0 :(得分:22)

不,delete []用于删除数组。如果您需要删除数组元素,则需要在每个元素上调用delete

答案 1 :(得分:7)

没有。原始指针不包含有关如何(或是否)应该释放其目标的信息,因此销毁它将永远不会删除目标。

这就是为什么你永远不应该使用它们来管理动态资源 - 你必须自己完成所有工作,这可能非常容易出错。相反,您应该使用RAII,用容器,智能指针和其他管理资源的类替换指针,并在销毁时自动释放它们。将动态数组替换为std::vector(或std::vector<std::unique_ptr>,如果您确实需要单独分配每个对象),所有内容都将自动解除分配。

答案 2 :(得分:3)

不,如果a是动态分配的原始指针数组,delete[] a;只删除原始指针数组占用的内存,但它会为指向的对象调用析构函数。

所以,如果这些原始指针是拥有指针,那么你有 leaktrocity :)

STL容器类与智能指针一起使用,例如std::vector<std::unique_ptr<X>>,用于更现代,更简单的方法:通过这种方式,您可以获得指针数组的异常安全自动销毁,以及对象指向。

答案 3 :(得分:2)

delete[]调用数组中每个元素的析构函数。由于指针是基本类型,它实际上没有析构函数,所以它什么都不做。

这就是使用智能指针的原因:delete[]将调用每个元素的析构函数,智能指针的析构函数将调用托管指针上的delete

所以:learn about smart pointers并停止手动管理内存。它更容易,更不容易出错,而且水平更低。

答案 4 :(得分:1)

delete []只会删除数组中的元素。它不会删除数组元素指向的内存。 如果要删除数组元素指向的内存

  1. 通过在每个数组元素上调用delete来显式删除每个内存
  2. 然后通过delete [] operator
  3. 删除数组

答案 5 :(得分:0)

不,delete[]仅释放由new[]

创建的数组

See the reference for more informations.