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[]创建的数组。


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

  • 通过对每个数组元素调用Delete显式删除每个内存
  • 然后通过delete[]操作符删除数组

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

    因此,如果这些原始指针拥有指针,那么就有泄漏率:)


    使用带有智能指针的STL容器类,例如
    std::vector
    ,可以实现更现代、更简单的方法:这样,指针数组和指向的对象都可以得到异常安全和自动销毁。

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

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


    所以:停止手动管理内存。它更简单、更不容易出错、级别更低。

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


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

    否,它将只删除数组。如果要删除所有指针,必须遍历并删除数组包含的所有指针。更好的是,使用std::vector(最好不要每个元素都是指针)。我知道std::vector,我想自己编写类似的类。否,无论如何,您不应该将指针存储在容器中。您可以使用智能指针数组在
    delete[]a
    上删除数组中的每个元素。它不仅“解除分配数组”,还会销毁数组元素。@KerrekSB,而不是数组元素指向的对象。可能在删除数组之前;-)