释放内存:A** mat = new A*[2]; (注:此为提问标题,无需回答)

5

我定义了:

A** mat = new A*[2];

但我该如何删除它呢?使用delete[] mat;还是delete[] *mat;


4
这正是RAII的用武之地。您无需担心释放它。 - chris
使用一个容器(智能指针类型)或者自己编写一个小包装器,重载operator()(正如chris所指出的,我最初推荐的是operator[])。 - 0xC0000022L
@0xC0000022L,operator()实际上是更好的选择。 - chris
@chris,说得好...对于多维数组来说确实是这样的 :) - 0xC0000022L
1
@0xC0000022L,是的,为了进一步阐述你的观点,您仍然可以使用1D RAII容器来实现它 :) - chris
类似于:http://stackoverflow.com/questions/14829597/free-allocated-memory-in-2d-dynamic-memory-allocation-array-in-c - chris
2个回答

7

只有在您不进行额外的分配时,才需要执行delete[] mat;。然而,如果您在数组中分配了数组,则还需要删除它们:

A** mat = new A*[2];
for (int i = 0 ; i != 2 ; i++) {
    mat[i] = new A[5*(i+3)];
}
...
for (int i = 0 ; i != 2 ; i++) {
    delete[] mat[i];
}
delete[] mat;

1
不错的答案,但这不仅适用于二维数组。他可能有一个指向已分配内存的A类型指针数组(mat[i] = new A();),这将需要使用delete mat[i];而不是delete [] mat[i];。但你已经接近了解决方法 :) - Sellorio

2

第一个,delete[] mat

第二个将会删除数组中第一个元素所指向的内容(如果这就是你的全部代码,那么它不会指向任何内容),等同于delete [] mat[0]

另外,如果数组中的指针最终指向了你想要释放的分配内存,你需要手动删除每个元素。例如:

A** mat = new A*[2];
mat[0] = new A;
mat[1] = new A[3];

那么你需要做的是:
delete mat[0];
delete[] mat[1];
delete[] mat;

1
我想点赞你,只是因为你的用户名是matt。也就是说,看到matt的评论,应该使用for() delete[] mat[i];delete[] mat;来释放A** mat。明白了吗,@matt? - axon
如果你一开始就写了那个分配代码,你也需要辞职了... - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接