C++ 删除指向指针的指针(作为数组的数组)
我的代码中有:C++ 删除指向指针的指针(作为数组的数组),c++,pointers,delete-operator,C++,Pointers,Delete Operator,我的代码中有: double** desc = new double* [size_out]; for (int i = 0; i < size_out; i++) desc[i] = new double [size_in]; 或 for(int i=0;i您的删除应该反映您的分配。 由于您使用了new[]来分配外部数组,并且new[](在循环中)来分配内部数组,因此删除时也要这样做。即:您的第二个解决方案是正确的;delete[]在循环中删除内部数组,最后通过delete[]
double** desc = new double* [size_out];
for (int i = 0; i < size_out; i++)
desc[i] = new double [size_in];
或
for(int i=0;i您的删除应该反映您的分配。
由于您使用了new[]
来分配外部数组,并且new[]
(在循环中)来分配内部数组,因此删除时也要这样做。即:您的第二个解决方案是正确的;delete[]
在循环中删除内部数组,最后通过delete[]
也删除外部数组
上述,C++中的一个(多,强<多/强>)更好的解决方案是使用嵌套的<代码> STD::向量< /代码>:
// Declaration and initialization:
vector<vector<double> > desc(size_out, vector<double>(size_in));
// No deletion!
//声明和初始化:
矢量描述(输出尺寸,输入尺寸);
//不删除!
我愿意
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete [] desc;
for(int i=0;i遵循的简单规则:
- 对于每个分配,都必须进行解除分配(因此ex1是错误的)
- 使用
new
分配的内容应使用delete
释放,使用new[]
分配的内容应使用delete[]
释放,使用malloc
分配的内容应使用free
释放(因此,ex3是错误的)
结论,ex2是正常的。解决方案2是正确的:每个单元格指向一个动态分配的数组,应该使用delete[]
删除该数组。最后,
应使用delete[]
删除desc
数组本身
奖励解决方案4:避免使用数组,并切换到std::vector
您的代码不应编译。数组新表达式的类型是指向正在创建的数组元素类型的指针(该值是指向所分配数组的第一个元素的指针)
因此,newdouble**[size\u out]
的类型是double***
无论何时使用new的数组形式,都必须使用delete的数组形式,即使只分配大小为1的数组
double*** desc = new double**[size_out];
for (int i=0; i<size_out; i++)
desc[i] = new double*[size_in];
for (int i=0; i<size_out; i++)
delete[] desc[i];
delete[] desc;
看看这里:谢谢,但不幸的是我需要用这双**
// Declaration and initialization:
vector<vector<double> > desc(size_out, vector<double>(size_in));
// No deletion!
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete [] desc;
double*** desc = new double**[size_out];
for (int i=0; i<size_out; i++)
desc[i] = new double*[size_in];
for (int i=0; i<size_out; i++)
delete[] desc[i];
delete[] desc;
double** desc = new double*[size_out];
for (int i=0; i<size_out; i++)
desc[i] = new double[size_in];
for (int i=0; i<size_out; i++)
delete[] desc[i];
delete[] desc;