删除双指针(矩阵)

Deleting a doublepointer (matrix)

本文关键字:矩阵 指针 删除      更新时间:2023-10-16

我正在解决一个量子力学问题,这个问题需要我通过操纵一些矩阵来找到一些特征值。这个问题的细节是不相关的,我只是需要帮助与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,因为我需要它在其他函数中(内部//物理)。

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

根据我的教授,我必须在分配

的相同函数中进行分配

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

无论如何,你可以不使用类,如果你做一个矩阵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);
}
delete A;

必须是

delete[] A;

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

vector<vector<double>> matrix;

你的代码有几个问题。

(1)你是没有分配内存给A的指针成员。即A[i]不与new[]分配。所以访问它们是一个未定义的行为

(2)如果一个指针被分配了new[],你必须为它执行delete[]。在你的其他功能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])
{
  ...
}