我在下面的代码中遇到了非常令人沮丧的错误。那是我的阵容。
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;
这会导致每次核心转储。我尝试了许多不同的方法来销毁它,每次都会遇到这个错误。我在这里弄错了什么?
答案 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
使用标准容器和智能指针可以轻松避免手动内存管理。这样做可以使代码更清晰,并且减少悬挂指针和内存泄漏的机会。