delete[] a
,其中a
是动态分配的指针数组,是否为数组中的每个指针执行delete
?
我想,它会为具有用户定义类的数组执行析构函数,但是指针会发生什么?
答案 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 []只会删除数组中的元素。它不会删除数组元素指向的内存。 如果要删除数组元素指向的内存
答案 5 :(得分:0)
不,delete[]
仅释放由new[]