当前位置:  开发笔记 > 编程语言 > 正文

为什么析构函数不释放数组内存?

如何解决《为什么析构函数不释放数组内存?》经验,为你挑选了1个好方法。

我的问题是为什么析构函数不释放我的临时数组的内存?Valgrind告诉我,我在构造函数中使用了new运算符,但之后没有删除内存.当我简单地写作时delete temp,我在Valgrind中遇到了许多错误,例如无效读取大小,双重免费等等.你能告诉我们这里发生了什么吗?

array_xyz(const int r, const int c, double **arg_array) {

    rows = r;
    cols = c;
    array_xyz *temp = new array_xyz();
    temp->arr = new double *[rows];
    temp->rows = r;
    temp->cols = c;
    arr = new double *[rows];

    for (int i = 0; i < rows; i++) {
        arr[i] = new double [cols];
        temp->arr[i] = new double [cols];
    }

    for (int j = 0; j < rows; j++) {
        for (int k = 0; k < cols; k++)
            temp->arr[j][k] = arg_array[j][k];
    }

    arr = temp->arr;
    //delete temp; -> doesn't work, valgrind tells that I free memory twice
}

array_xyz() {
    rows = 0;
    cols = 0;
    arr = NULL;
}

~array_xyz() {
    for (int i = 0; i < rows; i++)
        delete []arr[i];
    delete []arr;
}

user31264.. 5

您分配arr(及其所有行)和temp_arr(及其所有行).然后你做arr=temp_arr;.它不会复制temp_arrto的值arr.相反,它强制arr指向相同的地址temp_arr.分配给arr以前的整个内存现在是孤立的(没有指向它的指针,所以你不能释放它,它没有用处).如果删除temp_arr,它会自动删除arr,因为它们现在指向内存中的相同位置.



1> user31264..:

您分配arr(及其所有行)和temp_arr(及其所有行).然后你做arr=temp_arr;.它不会复制temp_arrto的值arr.相反,它强制arr指向相同的地址temp_arr.分配给arr以前的整个内存现在是孤立的(没有指向它的指针,所以你不能释放它,它没有用处).如果删除temp_arr,它会自动删除arr,因为它们现在指向内存中的相同位置.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有