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

yel*_*lo3 30 c++ pointers delete-operator

我的代码中有这个:

double** desc = new double* [size_out];
for (int i = 0; i < size_out; i++)
    desc[i] = new double [size_in];
Run Code Online (Sandbox Code Playgroud)

我该如何删除desc

我应该这样做:

delete [] desc;
Run Code Online (Sandbox Code Playgroud)

要么

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete [] desc;
Run Code Online (Sandbox Code Playgroud)

要么

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete desc;
Run Code Online (Sandbox Code Playgroud)

Let*_*_Be 23

遵循的简单规则:

  • 对于每个分配,必须进行重新分配(ex1因此是错误的)
  • 使用时new应该释放使用的内容delete,使用时new[]应该释放使用delete[]和使用malloc应该使用解除分配free(ex3因此是错误的)

结论,ex2可以.


CB *_*ley 21

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

所以类型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;
Run Code Online (Sandbox Code Playgroud)

请注意,您仍然没有分配任何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;
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 18

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

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

这就是说,一个(,在C++)更好的解决办法是使用嵌套std::vector:

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

// No deletion!
Run Code Online (Sandbox Code Playgroud)


ice*_*ime 6

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

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


Ste*_*and 5

我会做

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete [] desc;
Run Code Online (Sandbox Code Playgroud)

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

正如Rupdolph所说:停止使用C阵列,并开始使用std::vector.你会有更少的错误(错误少百倍).