删除指向指针的指针(作为数组的数组)

时间:2010-11-16 12:12:10

标签: c++ pointers delete-operator

我的代码中有这个:

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;

5 个答案:

答案 0 :(得分:21)

要遵循的简单规则:

  • 对于每个分配,必须进行重新分配(ex1因此是错误的)
  • 应使用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。你会有更少的错误(错误减少百倍)。