我想用二维指针制作矩阵。
当我使用'malloc'和'free'函数进行内存使用时没有问题(参见我的代码)。 但是,我无法使用'new'和'delete'编写相同的代码。
如您所知,1-D指针可以通过'new'声明。例如,
double *example = new double [10];
delete [] example;
然后,如何使用'new'来声明二维指针?
double **matrix; // 2-D pointer which represents entries of a matrix
int row, column; // the number of rows and column of the matrix
int i;
// set the size of the matrix
row = 3;
column = 5;
// allocate memories related to the number of rows
matrix = (double **)malloc(sizeof(double *) * row);
// allocate memories related to the number of columns of each row
for(i = 0; i < row; i++)
{
matrix[i] = (double (*))malloc(sizeof(double) * column);
}
// example: use of matrix
matrix[2][4] = 10.5;
// return used memories
free(matrix);
答案 0 :(得分:5)
嗯,直接的等价物是这样的:
// allocate memories related to the number of rows
double** matrix = new double*[row];
// allocate memories related to the number of columns of each row
for(i = 0; i < row; i++)
{
matrix[i] = new double[column];
}
// usage here
// de-allocate memories related to the number of columns of each row
// (YOU FORGOT THIS IN YOUR ORIGINAL CODE!!!)
for(i = 0; i < row; i++)
{
delete matrix[i];
}
delete[] matrix;
但是,真的,你不想要这个。这是一个完整的混乱,并没有像记忆本地一样。
更不用说手动内存管理完全容易出错,原因是您的原始代码中有row
double
个泄漏事实。
这有什么问题:
struct Matrix
{
Matrix(const unsigned int row, const unsigned int column)
: row(row)
, column(column)
, data(row*column, 0)
{}
double& at(const unsigned int y, const unsigned int x)
{
return data[y + x*row];
}
private:
const unsigned int row, column;
std::vector<double> data;
};
它使用vector
来避免任何的讨厌的内存管理,并将2D索引访问包装在实际上是单个数据缓冲区的周围,这样你就没有 n < / em>指针间接。
您可以根据需要将布局调整为行主要或列主要。
答案 1 :(得分:1)
您不必单独分配列。一个大块就足够了,这也使得删除起来更容易。
要分配:
double** matrix = new double* row;
double* ptr = new double [row * column];
for ( int i = 0; i < row; i++, ptr += column )
matrix[i] = ptr;
要免费:
delete [] matrix[0];
delete [] matrix;
答案 2 :(得分:0)
分配,
double** matrix = new double*[row];
for(size_t i = 0 ; i < row ; ++i)
matrix[i] = new double[column];
取消分配,
for(size_t i = 0 ; i < row ; ++i)
delete matrix[i];
delete[] matrix;
答案 3 :(得分:0)
我的方法略有不同,而不是其他解决方案。该函数有3个参数,3D指针( double
,指针指向一个指向指针的指针x
),大小为{{ 1}}和rows
size_t (索引的有符号值是开销)。它只允许通过间接引用函数来使用在main()中定义的2D指针变量。 En passant,可以使用 columns
完成。
double**& x