Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;删除二维动态分配数组_C++_Arrays_Dynamic Allocation - Fatal编程技术网

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;