Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ does delete[]deep删除C++;?_C++_Arrays_Memory Management_Struct - Fatal编程技术网

C++ does delete[]deep删除C++;?

C++ does delete[]deep删除C++;?,c++,arrays,memory-management,struct,C++,Arrays,Memory Management,Struct,假设我有一个结构数组,而这些结构中又有动态分配的数组,delete[]deep会删除我上面提到的所有内容吗 例如,考虑到我有这样的结构: struct A { char* name; float* data; int** image; }; 在我的代码中我创建了一些地方 A** array = new A[n]; 我为数组中的所有结构分配内存 for(int i=0; i<n; i++) { array[i] = new A; } for(inti=0;iNo 如果您

假设我有一个结构数组,而这些结构中又有动态分配的数组,delete[]deep会删除我上面提到的所有内容吗

例如,考虑到我有这样的结构:

struct A
{
  char* name;
  float* data;
  int** image;
};
在我的代码中我创建了一些地方

A** array = new A[n];
我为数组中的所有结构分配内存

for(int i=0; i<n; i++)
{
  array[i] = new A;
}
for(inti=0;iNo

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

struct A {
   string name;
   vector<float> data;
   vector<vector<int>> image;
}
结构A{ 字符串名; 矢量数据; 矢量图像; }

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

struct A {
   string name;
   vector<float> data;
   vector<vector<int>> image;
}
结构A{ 字符串名; 矢量数据; 矢量图像; }
否。要实现这一点,您必须提供析构函数(但在这种情况下,复制结构时要小心,如果您没有正确实现或删除复制构造函数,则最终会导致双
删除
s)


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

不。要做到这一点,您必须提供析构函数(但在这种情况下,复制结构时要小心,如果没有正确实现或删除复制构造函数,则会导致双
delete
s)



实际上,更好的办法是使用标准库容器而不是原始指针——因为它们提供自己的析构函数,它们会自动被销毁(在复制的情况下,您不必担心,因为它们实现了正确的复制语义).

除非您提供了相应的析构函数,否则不可以。

除非您提供了相应的析构函数,否则不可以。

您应该使用类而不是结构,并为此定义显式析构函数。不,它不是递归的。另外,
a**array=new a[n]“< /代码>要么太多,要么代码> */Cube >要么太少。@ Ben在C++中,代码< >类< /> >和<代码>结构> <代码>,而不是默认访问说明符。当然,这并不意味着这里不应该使用类。它将更干净,如果这要扩展到函数等,它可能会进入一个Head。r/cpp文件集?似乎只使用一个类会是一个更好的主意。@Ben和您可以将所有函数等同样地放在
结构中。除了样式之外,没有理由使用它们。@Ben在
结构
之间的选择纯粹是样式或约定。没有根本的区别在语言级别上的nce。您可以使用其中一种来表示完全相同的类型。您应该使用类而不是结构,并为此定义显式析构函数。不,它不是递归的。此外,
a**array=new a[n]“< /代码>要么太多,要么代码> */Cube >要么太少。@ Ben在C++中,代码< >类< /> >和<代码>结构> <代码>,而不是默认访问说明符。当然,这并不意味着这里不应该使用类。它将更干净,如果这要扩展到函数等,它可能会进入一个Head。r/cpp文件集?似乎只使用一个类会是一个更好的主意。@Ben和您可以将所有函数等同样地放在
结构中。除了样式之外,没有理由使用它们。@Ben在
结构
之间的选择纯粹是样式或约定。没有根本的区别语言级别的nce。您可以使用其中任何一种来表示完全相同的类型。您应该将其设置为否、粗体和巨大,以获得戏剧性的效果!可能值得注意的是SmartPtr/shared\u ptr/auto\u ptr在这里,它们还提供了自动资源处理,同时仍然具有指针样式行为shared\u ptr不适用于C数组(除非您提供了一个定制的删除器,这会变得有点复杂)。您应该将其设置为否、粗体和巨大,以获得戏剧性的效果!这里可能值得注意的是SmartPtr/shared_ptr/auto_ptr,它们还提供了自动资源处理,同时仍然具有指针样式的行为shared_ptr不适用于C数组(除非您提供一个定制的删除器,这会变得有点复杂)。