我的代码中有这个:
double** desc = new double* [size_out];
for (int i = 0; i < size_out; i++)
desc[i] = new double [size_in];
如何删除此desc
?
我应该这样做:
delete [] desc;
或
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete [] desc;
或
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete desc;
答案 0 :(得分:21)
要遵循的简单规则:
new
释放使用delete
分配的内容,使用new[]
取消分配delete[]
,并使用malloc
取消分配free
1}}(ex3因此错了)结论,ex2没问题。
答案 1 :(得分:21)
您的代码不应该编译。数组新表达式的类型是指向正在创建的数组元素类型的指针(该值是指向已分配数组的第一个元素的指针)。
因此new double**[size_out]
的类型为double ***
。
每当使用new的数组形式时,即使只分配了一个大小为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;
请注意,您仍然没有分配任何double
,只是指针。
你真的想要这个吗?
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;
答案 2 :(得分:18)
您的删除应该反映您的分配。
由于您使用new []
来分配外部数组,并使用new []
(在循环中)来分配内部数组,因此也需要进行删除。那就是:你的第二个解决方案是正确的; delete []
循环中的内部数组,最后也是delete []
的外部数组。
也就是说,C ++中的一个(很多,很多)更好的解决方案是使用嵌套的std::vector
:
// Declaration and initialization:
vector<vector<double> > desc(size_out, vector<double>(size_in));
// No deletion!
答案 3 :(得分:6)
解决方案2 是正确的:每个单元格指向应使用delete[]
删除的动态分配的数组。最后,
应使用desc
删除delete[]
数组本身。
Bonus解决方案4 :避免使用数组并切换到std::vector<std::vector<double> >
。
答案 4 :(得分:5)
我愿意
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete [] desc;
对于使用new []
分配的每个数组,您都有相应的delete []
。
正如Rupdolph所说:停止使用C阵列,并开始使用std::vector
。你会有更少的错误(错误减少百倍)。