0

我正在解决一个量子力学问题,该问题需要我通过操纵一些矩阵来找到一些特征值。这个问题的细节无关紧要,我只需要 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在汉密尔顿函数内部,因为我在其他函数中需要它(在 //Physics 内部)。

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

4

3 回答 3

2
delete A;

需要是

delete[] A;

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

vector<vector<double>> matrix;
于 2011-09-24T12:50:04.677 回答
2

根据我的教授的说法,我必须在与分配相同的功能中解除分配

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

无论如何,如果你制作一个 Matrixstruct和关联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);
}
于 2011-09-24T13:38:54.980 回答
0

您的代码有几个问题。

(1)没有将内存分配给A. 即A[i]没有分配给new[]. 所以访问它们是一种未定义的行为

(2)如果指针是用 分配的,则必须delete[]为指针执行new[]。在你的其他功能delete A;是错误的。采用delete[] A;

(3)使用new/new[]不是唯一的分配方式。事实上,当别无选择时,您应该使用这种动态分配。从您的代码看来,您是硬编码N=1000。所以最好使用二维数组。

const int N = 1000;  // globally visible
int main ()
{
  double A[N][N];
  ...
}
void hamiltonian (double (&A)[N][N])
{
  ...
}
于 2011-09-24T12:56:05.637 回答