32

我的代码中有这个:

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;

?

4

5 回答 5

30

遵循的简单规则:

  • 对于每个分配,必须有一个释放(因此 ex1 是错误的)
  • 分配的使用new应该被释放使用delete,使用new[]应该被释放使用delete[]并且使用malloc应该被释放使用free(因此ex3是错误的)

结论,ex2是可以的。

于 2010-11-16T12:15:08.647 回答
21

你的代码不应该编译。数组 new 表达式的类型是指向正在创建的数组元素类型的指针(值是指向已分配数组的第一个元素的指针)。

所以 的类型new double**[size_out]double ***

每当使用 new 的数组形式时,即使只分配一个大小为 1 的数组,也必须使用 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<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;
于 2010-11-16T12:43:25.607 回答
19

您的删除应该反映您的分配。

由于您曾经new []分配外部数组,并且new [](在循环中)分配内部数组,因此同样进行删除。那就是:您的第二个解决方案是正确的;delete []循环中的内部数组,最后也是外部数组delete []

也就是说,在 C++ 中一个(很多很多)更好的解决方案是使用嵌套std::vector

// Declaration and initialization:
vector<vector<double> > desc(size_out, vector<double>(size_in));

// No deletion!
于 2010-11-16T12:14:13.460 回答
6

我会做

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete [] desc;

对于用 分配的每个数组new [],您都有一个对应的delete [].

正如 Rupdolph 所说:停止使用 C 数组,开始使用std::vector. 您将有更少的错误(错误减少数百倍)。

于 2010-11-16T12:14:52.180 回答
6

解决方案 2是正确的:每个单元格都指向一个动态分配的数组,应该使用delete[]. 最后,desc应该使用删除数组本身delete[]

奖励解决方案 4:避免使用数组并切换到std::vector<std::vector<double> >.

于 2010-11-16T12:15:32.227 回答