删除双指针(矩阵)
Deleting a doublepointer (matrix)
我正在解决一个量子力学问题,这个问题需要我通过操纵一些矩阵来找到一些特征值。这个问题的细节是不相关的,我只是需要帮助与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
和相关的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);
}
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])
{
...
}
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 涉及指针和手动实现的矩阵类的问题
- 用于输出矩阵的二维指针
- C++:通过常量引用传递指针矩阵
- 如何动态分配由三重指针到类的矩阵?
- 如何使用 GSL 库将雅可比矩阵引用为空指针
- 将 3x4 矩阵指针与 16 对齐
- 动态分配的矩阵不会获得指向指针的指针
- 如何从C DLL返回的指针中获得VBA中的整个矩阵
- 使用malloc和指针替换矩阵中的向量
- 无法更改指针矩阵的值
- 使用指针的矢量矩阵在对象上调用析构函数时程序崩溃
- 存储在存储在堆栈中的堆与矩阵中的矩阵可以看作是一系列指针
- 三角矩阵,C ,Getters和Setter,双指针
- 矩阵指针语法
- 如何在 c++ 中返回矩阵指针
- 我可以在 cblas_gemm(...) 中传递与 "C" 和"A"矩阵相同的矩阵指针吗?
- 矩阵指针c++
- 矩阵指针释放问题
- 按列访问矩阵指针