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
遵循的简单规则:
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)
解决方案2是正确的:每个单元指向一个应该使用删除的动态分配的数组delete[].最后,desc应该使用删除数组本身delete[].
奖金解决方案4:避免使用数组并切换到std::vector<std::vector<double> >.
我会做
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.你会有更少的错误(错误少百倍).
| 归档时间: |
|
| 查看次数: |
32643 次 |
| 最近记录: |