delete[ ] 是不是会深度删除 C++ 中的结构?

Posted

技术标签:

【中文标题】delete[ ] 是不是会深度删除 C++ 中的结构?【英文标题】:does delete[ ] deep deletes a structure in C++?delete[ ] 是否会深度删除 C++ 中的结构? 【发布时间】:2014-07-15 06:20:53 【问题描述】:

假设如果我有一个结构数组,其中又动态分配了数组,delete[] 是否会删除我上面所说的所有内容?

例如,假设我有这样的结构:

struct A

  char* name;
  float* data;
  int** image;
;

我创建的代码中的某个地方

A** array = new A[n];

我为数组中的所有结构分配内存

for(int i=0; i<n; i++)

  array[i] = new A;

然后在其他地方类似地填充结构的内容(使用 malloc/new 创建名称、数据和图像)。

现在如果我说delete[] array;,到目前为止分配的所有内存(用于 char*、float*、int**、结构和数组)都会被销毁吗?

【问题讨论】:

您应该使用类而不是结构并为此定义显式析构函数。 不,它不是递归的。此外,A** array = new A[n];* 要么太多,要么太少。 @Ben 除了默认访问说明符之外,C++ 中的 classstruct 没有区别。 @T.C.当然,但这并不意味着不应该在这里使用一个类。它会更干净,如果要扩展为具有功能等,它可能会进入 header/cpp 文件集?似乎只使用一个类会更好。 @Ben 您也可以将所有功能等都放在struct 中。除了样式之外,没有理由将其用于另一个。 @Ben classstruct 之间的选择纯粹是风格或惯例。在语言层面上没有根本区别。您可以使用任何一种来表达完全相同的类型。 【参考方案1】:

没有。

如果您想要更自动的内存管理,请使用向量。

struct A 
   string name;
   vector<float> data;
   vector<vector<int>> image;

【讨论】:

你应该让它不,大胆和巨大,以获得戏剧效果! 这里可能值得注意的是 SmartPtr/shared_ptr/auto_ptr,它们还提供自动资源处理,同时仍然具有指针式行为 shared_ptr 不适用于 C 数组(除非您提供自定义删除器,这会有点复杂)。【参考方案2】:

不。为此,您必须提供一个析构函数(但在复制结构时要小心,如果您没有正确实现或删除复制构造函数,您最终会得到双 deletes)。

实际上,一个更好的主意是使用标准库容器而不是原始指针 - 因为它们提供自己的析构函数,它们会自动销毁(并且您不必担心复制的情况,因为它们实现了正确的复制语义)。

【讨论】:

【参考方案3】:

除非您提供适当的析构函数,否则不会。

【讨论】:

以上是关于delete[ ] 是不是会深度删除 C++ 中的结构?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 delete vs delete[] 运算符

C++ delete[] 是不是足以在数组后清理?

百战c++

百战c++

百战c++

C++ 中的 new/delete 导致奇怪的内存泄漏