c ++ deallocate 2d int array error

时间:2014-05-15 15:59:16

标签: c++ arrays memory-management

我在下面的代码中遇到了非常令人沮丧的错误。那是我的阵容。

int **tab2 = new int*[3];

我像这样分配它。

for(i = 0; i < 10; i++) {
    tab2[i] = new int[3];
    tab2[i][0] = 40;
    tab2[i][1] = 10;
    tab2[i][2] = 100;
}

然后在使用它之后我想破坏它。

for(i = 0; i < 10; i++) {
    delete [] tab2[i];
}
delete [] tab2;

这会导致每次核心转储。我尝试了许多不同的方法来销毁它,每次都会遇到这个错误。我在这里弄错了什么?

3 个答案:

答案 0 :(得分:3)

int **tab2 = new int*[3];

不符合你的想法。

你想要一个包含TEN(10)指针的数组,每个指针都包含三个整数数组。

new int*[3]是一个包含三个指针的数组。

What you want is this (live at coliru)

#include <iostream>

int main() {

  int **tab2 = new int*[10];

  for(int i = 0; i < 10; i++) {
    tab2[i] = new int[3];
    tab2[i][0] = 40;
    tab2[i][1] = 10;
    tab2[i][2] = 100;
  }

  for(int i = 0; i < 10; i++) {
    delete [] tab2[i];
  }
  delete [] tab2;

}

答案 1 :(得分:2)

int **tab2 = new int*[3];

你分配一个大小为3的指针数组。但是与

相比
for(i = 0; i < 10; i++) {
    tab2[i] = new int[3];
    //...
}

您最多可以使用索引9来访问它。那肯定会出问题。 删除过程对我来说很好。要修复它,您应该分配一个大小为10而不是3的指针数组,例如

int **tab2 = new int*[10];

答案 2 :(得分:2)

看起来你要做的就是创建一个N by M数组,其中N在运行时已知且M是固定的(在本例中为3)。

为什么不这样做?

{
    std::array<int, 3> defaults = {{ 40, 10, 100 }};
    std::vector<std::array<int, 3>> thing(10, defaults);
}

向量thing在超出范围时会自动释放,其大小可以在运行时设置。您仍然以相同的方式访问结构:

thing[1][2] = 3

使用标准容器和智能指针可以轻松避免手动内存管理。这样做可以使代码更清晰,并且减少悬挂指针和内存泄漏的机会。