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

C++ 删除指向指针的指针(作为数组的数组),c++,pointers,delete-operator,C++,Pointers,Delete Operator,我的代码中有: 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您的删除应该反映您的分配。 由于您使用了new[]来分配外部数组,并且new[](在循环中)来分配内部数组,因此删除时也要这样做。即:您的第二个解决方案是正确的;delete[]在循环中删除内部数组,最后通过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您的删除应该反映您的分配。

由于您使用了
new[]
来分配外部数组,并且
new[]
(在循环中)来分配内部数组,因此删除时也要这样做。即:您的第二个解决方案是正确的;
delete[]
在循环中删除内部数组,最后通过
delete[]
也删除外部数组

上述,C++中的一个(多,强<多/强>)更好的解决方案是使用嵌套的<代码> STD::向量< /代码>:

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

// No deletion!
//声明和初始化:
矢量描述(输出尺寸,输入尺寸);
//不删除!
我愿意

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

for(int i=0;i遵循的简单规则:

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

结论,ex2是正常的。

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


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

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

因此,
newdouble**[size\u out]
的类型是
double***

无论何时使用new的数组形式,都必须使用delete的数组形式,即使只分配大小为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;

看看这里:谢谢,但不幸的是我需要用这双**
// Declaration and initialization:
vector<vector<double> > desc(size_out, vector<double>(size_in));

// No deletion!
for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete [] desc;
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** 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;