【问题标题】:free the memory of: A** mat = new A*[2];释放内存:A** mat = new A*[2];
【发布时间】:2013-05-24 03:20:14
【问题描述】:

我定义了:

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

但是我怎样才能删除它呢?使用delete[] mat;delete[] *mat;

【问题讨论】:

  • 这正是 RAII 的优势所在。您不必担心释放它。
  • 使用容器(智能指针类型)或者自己写一个小包装器,重载operator()(正如下面的chris指出的,我最初推荐operator[]
  • @0xC0000022L, operator() 是更好的选择。
  • @chris,公平点......对于多维数组,它肯定是:)
  • @0xC0000022L,是的,为了扩展您的观点,您仍然可以使用 1D RAII 容器来实现它:)

标签: c++ pointers delete-operator


【解决方案1】:

第一个,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;

【讨论】:

  • 我想为你投票只是因为你的用户名是 matt。即见 matt 的评论,A** mat 应该使用for() delete[] mat[i];delete[] mat; 来解除分配。明白了吗@matt?
  • 如果你一开始就写了那个分配代码,你也需要辞职......
【解决方案2】:

只有当您不进行额外分配时,它才是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;

【讨论】:

  • 很好的答案,但它不仅适用于二维数组。他可以有一个指向 A 的指针数组,其中分配了内存 (mat[i] = new A();),这将需要一个 delete mat[i]; 调用而不是 delete [] mat[i];。但是你已经足够接近了:)
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2016-02-17
  • 2014-01-07
  • 2016-05-08
  • 2012-09-13
  • 2013-02-27
相关资源
最近更新 更多