我正在解决一个量子力学问题,该问题需要我通过操纵一些矩阵来找到一些特征值。这个问题的具体细节无关紧要,我只需要有关 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 内)中需要它。
肯定有办法解决这个问题吗?可能听起来我有点无知,但如果我必须在与分配相同的函数中解除分配,这听起来像是一个效率较低的设计。
最佳答案
According to my professor I have to deallocate in the same function as I allocate
那是纯粹的愚蠢。有时(几乎总是)您需要在函数外部使用分配的结构。对于对象来说绝对是错误的,因为构造函数和析构函数是不同的函数。
无论如何,如果你制作一个 Matrix struct
和关联的 newMatrix
和 deleteMatrix
函数,你可以不用类就可以逃脱:)
#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);
}
关于c++ - 删除双指针(矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7539113/