c++ - 删除双指针(矩阵)

标签 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,因为我在其他函数(在//Physics 内)中需要它。

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

最佳答案

According to my professor I have to deallocate in the same function as I allocate

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

无论如何,如果你制作一个 Matrix 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);
}

关于c++ - 删除双指针(矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7539113/

相关文章:

c++ - 我正在用 placement new 做一些时髦的事情,但事情都失败了。解决方法?

java - 当我们尝试使用 'new' 创建原始数组对象时会调用哪个类构造函数

c++ - 重新实现 QThread 的 start()

c++ - 当我在我的 Makefile 中链接它时,我可以从 lib 中删除一些模块吗?

c - scanf之后的动态内存分配

调用的内存似乎为 NULL

ios - XCode iOS operator 新的自定义实现

C++:为什么 std::system ("exit 1") 返回 256?

c++ - 如何运行 .h 中的函数列表

c++ - 如何仅通过标准库引用二维数组来使用动态创建的一维数组?