删除双指针(矩阵)

时间:2011-09-24 12:47:30

标签: c++ dynamic-allocation new-operator

我正在解决量子机械问题,这需要我通过操纵一些矩阵来找到一些特征值。这个问题的具体细节是不相关的,我只是需要c ++问题的帮助,我是这种语言的新手,经过几个小时后,我想再尝试解决它本身是徒劳的,所以我求助于你

我遇到这个问题,glibc在我的程序结束时检测到错误,我无法正确解除分配,它太大了,不能在这里复制,所以我只会复制实际出错的部分。

void hamiltonian(int, double **&);

int i,j;

int main()
{
int N = 1000; double **A;

hamiltonian(N, A);

//Physics here
.
.
.
.
.
//Delete
for(i=0; i<N; i++){delete []A[i];}
delete []A;

return 0;
}

void hamiltonian(int N, double **&A)
{
A = new double *[N];
for(i=0; i<N; i++)
{
A[i] = new double[N];
for(j=0; j<N; j++)
{
if(i==j)A[i][j] = 2;
if(i==j+1 || i==j-1){A[i][j] = 1;}
}
}
}

根据我的教授的说法,我必须释放与我分配的功能相同的功能,但是在我的项目差不多完成后我甚至没有考虑重新分配,所以我必须重写很多代码,问题在于我不能在汉密尔顿函数中解除分配A,因为我需要它在其他函数中(在//物理内部)。

肯定有办法解决这个问题吗?可能听起来对我有点无知但是如果我必须释放与我分配的功能相同的效果,这听起来像效率较低。

3 个答案:

答案 0 :(得分:2)

delete A;

需要

delete[] A;

如果你new[],你必须delete[]。另外,使用vector - 他们会照顾好自己。

vector<vector<double>> matrix;

答案 1 :(得分:2)

  

据我的教授说,我必须释放与我分配的功能相同的功能

那是纯粹的愚蠢。有时(几乎总是)您需要在函数外部使用已分配的结构。对象绝对是假的,因为构造函数和析构函数是不同的函数。

任何方式,如果您制作了矩阵struct以及相关的newMatrixdeleteMatrix函数,则可以在不使用课程的情况下离开:)

#include <cstddef>
#include <iostream>

using namespace std;

struct Matrix
{
    int n;
    int m;
    double** v;
};

Matrix newMatrix (int n, int m)
{
    Matrix A;
    A.n = n;
    A.m = m;
    A.v = new double*[n];
    for( int i = 0; i < n; i++ ){
        A.v[i] = new double[m];
    }
    return A;
}

Matrix newHamiltonianMatrix (int n, int m)
{
    Matrix A = newMatrix(n, m);
    for( int i = 0; i < A.n; i++ ){
        for( int j = 0; j < A.m; j++ ){
            A.v[i][j] = 0.0;
            if( i == j ){
                A.v[i][j] = 2.0;
            }
            if( i == j + 1 or i == j - 1 ){
                A.v[i][j] = 1.0;
            }
        }
    }
    return A;
}

void deleteMatrix (Matrix A)
{
    for( int i = 0; i < A.n; i++ ){
        delete [] A.v[i];
    }
    delete [] A.v;
    A.v = NULL;
}

int main ()
{
    Matrix A = newHamiltonianMatrix(10, 20);
    for( int i = 0; i < A.n; i++ ){
        for( int j = 0; j < A.m; j++ ){
            cout << A.v[i][j] << " ";
        }
        cout << endl;
    }
    deleteMatrix(A);
}

答案 2 :(得分:0)

您的代码存在一些问题。

(1)未向<{1}}的指针成员分配内存。即A未分配A[i]。因此,访问它们是未定义的行为

(2)如果指针分配了new[],则必须为delete[]执行此操作。在你的其他函数中new[]是错误的。使用delete A;

(3)使用delete[] A;不是唯一的分配方式。实际上,当没有选择时,你应该使用这种动态分配。从您的代码中可以看出,您正在编写new/new[]。所以最好使用2D数组。

N=1000