gpt4 book ai didi

c++ - 如何使用 'new' 而不是 'malloc' 动态分配二维数组?

转载 作者:行者123 更新时间:2023-11-30 00:48:51 27 4
gpt4 key购买 nike

我想用二维指针制作矩阵。

当我使用“malloc”和“free”函数进行内存使用时没有问题(参见我的代码)。但是,我无法使用“新建”和“删除”来编写相同的代码。

如您所知,一维指针可以用“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);

最佳答案

嗯,直接等价的是这样的:

// 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 指针间接寻址。

您可以根据需要将布局调整为行优先或列优先。

关于c++ - 如何使用 'new' 而不是 'malloc' 动态分配二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464119/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com