我在我的代码中使用二维动态分配的数组有问题。一切正常,直到我的程序试图调用我的tablica2D
对象的析构函数。我收到运行时错误" HEAP CORRUPTION DETECTED"当我的程序到达最后一个delete[] tab
命令时。这是否意味着它之前的循环已经释放了分配给tab
的所有内存?我的印象是,要释放所有动态分配的内存,每个delete
命令需要有一个new
命令。或者是导致此错误的其他原因?
以下是给我带来麻烦的课程代码:
class tablica2D
{
static const int k = 2;
int n, m;
string **tab;
public:
tablica2D(int n, int m)
{
this->n = n;
this->m = m;
tab = new string*[n];
for (int i = 0; i < m; i++)
{
tab[i] = new string[m];
}
}
string* operator [](int n)
{
return tab[n];
}
static const bool compareRows(const string* i, const string* j)
{
int x = atoi(i[k].c_str());
int y = atoi(j[k].c_str());
return x > y;
}
void sort()
{
std::sort(tab, tab + n, compareRows);
}
~tablica2D()
{
for (int i = 0; i < n; i++)
{
delete[] tab[i];
}
delete[] tab;
}
};
答案 0 :(得分:2)
您在new
循环中使用了错误的变量,另外还创建了一个3d数组而不是二维数组:
for (int i = 0; i < m; i++)
// ^^, should be n
{
tab[i] = new string[m];
// ^^^
// should be new string, not new string[m]
}
VS
for (int i = 0; i < n; i++)
// ^^, this one is correct
{
delete[] tab[i];
}
答案 1 :(得分:0)
如果我需要类似C的2D数组,我总是使用:
type **myarr = new type*[X];
myarr[0] = new type[X*Y];
for (int i = 1; i < X; i++) {
myarr[i] = myarr[0] + i * Y;
}
用法:
myarr[x][y]
然后解放:
delete[] myarr[0];
delete[] myarr;
同样,经过一些努力,可以应用于N维数组。