C++ 删除指针数组
C++ 删除指针数组,c++,arrays,pointers,delete-operator,C++,Arrays,Pointers,Delete Operator,delete[]a,其中a是指针的动态分配数组,是否对数组中的每个指针执行delete 我想,它对具有用户定义类的数组执行析构函数,但指针会发生什么情况?否,delete[]用于删除数组。如果需要删除数组元素,则需要对每个元素调用delete。否,delete[]仅释放由new[]创建的数组。 删除[]只会删除数组中的元素。它不会删除数组元素指向的内存。 如果要删除数组元素指向的内存 通过对每个数组元素调用Delete显式删除每个内存 然后通过delete[]操作符删除数组 否,如果a是动态分配
delete[]a
,其中a
是指针的动态分配数组,是否对数组中的每个指针执行delete
我想,它对具有用户定义类的数组执行析构函数,但指针会发生什么情况?否,
delete[]
用于删除数组。如果需要删除数组元素,则需要对每个元素调用delete
。否,delete[]
仅释放由new[]创建的数组。
删除[]只会删除数组中的元素。它不会删除数组元素指向的内存。 如果要删除数组元素指向的内存
否,如果
a
是动态分配的原始指针数组,delete[]a
只删除原始指针数组占用的内存,但不调用指向的对象的析构函数
因此,如果这些原始指针拥有指针,那么就有泄漏率:)
使用带有智能指针的STL容器类,例如
std::vector
,可以实现更现代、更简单的方法:这样,指针数组和指向的对象都可以得到异常安全和自动销毁。delete[]
将调用数组中每个元素的析构函数。由于指针是一种基本类型,它实际上没有析构函数,所以它什么也不做
这正是使用智能指针的原因:delete[]
将调用每个元素的析构函数,智能指针的析构函数将调用托管指针上的delete
所以:停止手动管理内存。它更简单、更不容易出错、级别更低。否。原始指针不包含有关如何(或是否)释放其目标的信息,因此销毁一个指针永远不会删除目标
这就是为什么您永远不应该使用它们来管理动态资源——您必须自己完成所有工作,这可能非常容易出错。相反,您应该使用,将指针替换为容器、智能指针和其他管理资源并在销毁时自动释放它们的类。将动态数组替换为
std::vector
(或std::vector
,如果您确实需要单独分配每个对象),所有内容都将自动解除分配。否,它将只删除数组。如果要删除所有指针,必须遍历并删除数组包含的所有指针。更好的是,使用std::vector(最好不要每个元素都是指针)。我知道std::vector,我想自己编写类似的类。否,无论如何,您不应该将指针存储在容器中。您可以使用智能指针数组在delete[]a
上删除数组中的每个元素。它不仅“解除分配数组”,还会销毁数组元素。@KerrekSB,而不是数组元素指向的对象。可能在删除数组之前;-)