【问题标题】:Does delete [] deallocate memory allocated by pointers to pointersdelete [] 是否释放由指向指针的指针分配的内存
【发布时间】:2011-11-15 21:04:57
【问题描述】:

我有一个指向其他对象的指针数组Comparable* array(在一个类的模板内)。

我知道delete 会删除指针引用的内存,delete [] 会释放分配给数组中每个指针的内存。

我的问题是,如果我有一个包含指向其他对象的指针的数组,我如何释放数组中每个指针引用的内存 数组本身?

【问题讨论】:

  • -1 不发布代码。代码让问题易于理解,而无需做出任何假设,这是非常常识。
  • +1 尽管发布代码通常是个好主意,但许多开发人员需要学习阅读纯文本,而不仅仅是程序。在这种情况下,纯文本就足够自我解释了。
  • @Serge:我已经学会了阅读纯文本,但是当我阅读我认为非常了解语言的人的帖子时,我就会这样做。当一个人对 C++ 基础有疑问时,我真的很怀疑他在用 纯文本 描述他的问题时是否正确使用了这些术语。例如,在标题中他写了 pointers to pointers,而在帖子中,他以“指针数组”开头。对你来说够清楚了吗?
  • @Nawaz 标题的 pointers to pointers 部分没有任何意义,但 IMO 他的问题很清楚。所有 3 个发布的答案都说同样的话,所以显然 Serge 和我不是唯一这么认为的人。

标签: c++ memory allocation delete-operator


【解决方案1】:

如果我有一个包含指向其他对象的指针的数组,如何释放数组中每个指针和数组本身引用的内存?

你刚才描述的方式:)循环遍历数组以删除每个对象,然后删除数组:

for (int i = 0; i < n; ++i)
    delete array[i];
delete[] array;

【讨论】:

  • +1,并记住在指向数组的指针数组的情况下,循环删除也应该是delete[]。简而言之,任何new type[n] 都需要delete[]。很好的答案。
【解决方案2】:

delete[] 为数组中的每个对象调用析构函数,如果这样的析构函数存在的话。对于指针数组,delete[] 不会释放每个指针,因为指针是没有析构函数的普通类型。您需要删除代码中的每个指针。

【讨论】:

  • 我的额头上纹了“指针没有析构函数”。
【解决方案3】:

您需要遍历数组以释放数组索引引用的位置,并且需要在循环结束后释放数组本身。

注意:假设您使用new[]动态分配

【讨论】:

    【解决方案4】:

    不,它没有。

    delete[] 删除使用new[] 分配的对象数组,而不是指针数组。

    【讨论】:

    • an array of objects?我会说 delete[] 删除指针指向的内存,使用 new[] 分配。
    • @Nawaz:错了。除了释放内存,delete[] 还调用对象析构函数。
    • @Nawaz:变量和数组元素是 C++ 中的对象。数组本身也是如此:)
    • @Nawaz:不,deletedelete[] 处理对象,而不是(仅)内存。当对象被删除时,需要调用它们的析构函数。这就是 deletedelete[] 所做的。
    • @Serge:正确。我写错了。我必须这样说:delete[] 删除使用 new[] 分配的指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多