【问题标题】:deallocation of a dynamic 2d string array in c++在 C++ 中释放动态二维字符串数组
【发布时间】:2013-12-02 16:52:28
【问题描述】:

我无法理解为什么我的删除方法不正确。

对于我的矩阵创建,我有:

 43    matrix = new string*[row];
 44    for(int i = 0; i < row; i++) {
 45       matrix[i] = new string[col];
 46    }
 47    for(int i = 0; i < row; i++) {
 48       for(int j = 0; j < col; j++) {
 49          matrix[i][j] = array[i][j];
 50          //cout << matrix[i][j] << ' ';
 51       }
 52       cout << endl;
 53    }

然后在我的析构函数中我有:

 15    for(int i = 0; i < row; i++) {
 16       delete matrix[i];
 17    }
 18    delete matrix;

我的程序在第一次删除条目时崩溃

【问题讨论】:

  • 试试delete [] matrix[i]delete [] matrix
  • 注意:delete[] 你是什么new[]delete 你是什么new。也就是说,我怀疑您的包含对象(matrix 是其中的成员)没有正确实施“三规则”。如果在修复数组删除语法后仍然存在这个问题(我想你会的),请发布包含 matrix 的类定义。
  • 使用 std::vector。没有正当理由不这样做。
  • @MadScienceDreams 您的解决方案有效。你能解释一下为什么它是'delete [] matrix[i]'而不是前者吗?
  • @Jack:这就是指定语言的方式:array-new,new[],必须与 array-delete,delete[] 匹配。原因是每个都可以单独替换为用户定义的版本。通常,您无需担心这些低级细节,因为您会使用 std::vector 为您管理动态数组。

标签: c++ dynamic multidimensional-array


【解决方案1】:

如前所述,您必须将new[]delete[] 配对。在这些行中:

matrix = new string*[row];
matrix[i] = new string[col];

您使用new[],因此稍后,您必须这样做:

delete[] matrix[i];
delete[] matrix;

有关参考,请参阅this link

当你分配你的二维数组时,你真的创建了 N 一维数组。现在每个都必须删除,但是 系统不知道有多少。的大小 顶级数组,即指向二级数组的指针 数组,就像 C 中的任何其他数组一样:它的大小不存储在 系统。

如果您使用 delete 而不是 delete [],这就是 valgrind 必须说的:

==30045== Mismatched free() / delete / delete []
==30045==    at 0x4A05FD6: operator delete(void*) (vg_replace_malloc.c:480)
==30045==    by 0x400725: main
==30045==  Address 0x4c2e040 is 0 bytes inside a block of size 160 alloc'd
==30045==    at 0x4A07152: operator new[](unsigned long) (vg_replace_malloc.c:363)
==30045==    by 0x400715: main

【讨论】:

    【解决方案2】:
     matrix = new string*[row];
     for(int i = 0; i < row; i++) {
        matrix[i] =delete[col];
     }
    delete[] matrix;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多