如何使用'new'代替'malloc'动态分配2D数组?

时间:2015-05-26 16:29:46

标签: c++ pointers multidimensional-array malloc

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

当我使用'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);

4 个答案:

答案 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

Run on IDE