萌新问一下如何用delete释放一个(数组指针)类型里的的数组元素

瑞芳 王 20 信誉分
2024-07-29T06:36:26.9933333+00:00

eg:

(Person*)  *p = new (Person*) [length];
p[i]=new Person();//i在这里是赋值的一种表现形式

对象p的一个星星接收new关键字的堆区地址,另一个用来标注Person*类型数组

记得应该可以用delete[] p来释放p数组来着,实际结果是等同于delete p;(就是数组里的Person* 类型没被释放,检验方法是在Person的析构函数写cout无打印)

我知道可以用for循环遍历p[i]后delete,但如题目所说,我该如何用delete[]释放p背后的Person* ?

(delete[] p也不行:)

(如果在析构的时候如果Person*类型的元素有成员是在堆区上的,那么不可读取;)

(如果没有,就会一直走析构)

Visual Studio
Visual Studio
一系列 Microsoft 集成开发工具套件,用于生成适用于 Windows、Web 和移动设备的应用程序。
107 个问题
C++
C++
一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。
144 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Minxin Yu 11,996 信誉分 Microsoft 供应商
    2024-07-29T09:10:22.5766667+00:00

    您好,

    delete[] p是释放数组指针变量本身的内存,不会删除指针指向的对象的内存。
    C++并没有嵌套的释放内存的方式, 需要使用循环遍历释放内存。

      for (int i = 0; i < length; i++) {
      delete p[i];
     }
    
      delete[] p; 
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    1 个人认为此答案很有帮助。

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。