C++ C++;删除二维动态分配数组
我在代码中使用的二维动态分配数组有问题。在我的程序尝试调用我的C++ C++;删除二维动态分配数组,c++,arrays,dynamic-allocation,C++,Arrays,Dynamic Allocation,我在代码中使用的二维动态分配数组有问题。在我的程序尝试调用我的tablica2D对象的析构函数之前,一切正常。当我的程序运行到最后一个delete[]tab命令时,我收到一个运行时错误“HEAP CORRUPTION DETECTED”。这是否意味着它前面的循环已经释放分配给选项卡的所有内存?我的印象是,要释放所有动态分配的内存,每个new命令都需要一个delete命令。还是其他原因导致了这个错误 下面是给我带来麻烦的类的代码: class tablica2D { static cons
tablica2D
对象的析构函数之前,一切正常。当我的程序运行到最后一个delete[]tab
命令时,我收到一个运行时错误“HEAP CORRUPTION DETECTED”。这是否意味着它前面的循环已经释放分配给选项卡的所有内存?我的印象是,要释放所有动态分配的内存,每个new
命令都需要一个delete
命令。还是其他原因导致了这个错误
下面是给我带来麻烦的类的代码:
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;
}
};
类tablica2D
{
静态常数int k=2;
int n,m;
字符串**选项卡;
公众:
表2D(整数n,整数m)
{
这个->n=n;
这个->m=m;
tab=新字符串*[n];
for(int i=0;iy;
}
空排序()
{
std::sort(tab,tab+n,compareRows);
}
~tablica2D()
{
对于(int i=0;i
您在新的循环中使用了错误的变量,并且另外创建了一个3d数组而不是2d数组:
for (int i = 0; i < m; i++)
// ^^, should be n
{
tab[i] = new string[m];
// ^^^
// should be new string, not new string[m]
}
for(int i=0;i
vs:
for(int i=0;i
如果我需要一个类似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;
}
那么对于释放:
delete[] myarr[0];
delete[] myarr;
同样,只要稍加努力,也可以应用于N维数组。有什么原因你不使用吗?看在上帝的份上,为什么你自己在为内存管理而挣扎,而在内存管理中,和?@πάντα完全可用ῥεῖ 也许这是一项作业。@RawN似乎有一种流行的教师分配这样的事情,而从不向学生提及正确实施这项任务所需的一切。例如,OP未能实施的“3法则”等问题。@PaulMcKenzie对此毫无疑问。我在东南欧看到了我的那部分胡说八道和伪科学。他们在这里“教”的东西很容易被贴上犯罪的标签。它不应该是n
而不是m
?事实上,它在第一个循环中也应该是n,但在这一变化之后,一切都起作用了。我忽略了这一点,因为我在测试中使用了m>n,所以我的数组有额外的空行,但可以容纳我试图放入的所有行。感谢您的快速响应。@Kurigalzu即使进行了此更改,您的tablica2D
类也很容易被两行main()程序破坏<代码>{tablica2dt1(10,10);tablica2dt2=t1;}
您未能在类中实现“3的规则”。
myarr[x][y]
delete[] myarr[0];
delete[] myarr;