在C++中的类的方法中传输动态分配的矩阵

Transfering a dynamically allocated matrix in a method of a class in C++

本文关键字:动态分配 传输 C++ 方法      更新时间:2023-10-16

我试图制作一个动态分配的可变大小二维数组,但我不知道为什么如果我创建自己的常数值,它就无法编译:

    const int oConstanta=N+1;
    int (*m)[oConstanta]=new int[oConstanta][oConstanta];

但是,当我在括号之间使用一个正常的常量(如1000)时,它会成功编译。

    const int oConstanta=N+1;
    int (*m)[1000]=new int[1000][1000];

有人知道原因吗?

PS:我知道:

    int **m=new int*[oConstanta];
    for(i=1;i<=N;i++)
    {
        m[i]=new int[oConstanta];
        init(m[i]);
    }

会解决我的问题,但我想知道为什么我以前的方法是个坏主意。

除非N是编译时常数表达式,否则oConstanta也不是编译时常数。

在C++中制作二维数组的最佳方法是使用std::vectors的std::vector,例如:

#include <vector>
std::vector<std::vector<int> > m(N+1,  std::vector<int>(N+1, 0));

最终原因是不能创建可变长度的静态数组。

在您的代码中,您试图创建一个由动态数组组成的静态数组,这两个数组的长度都是可变的。

现在,静态数组位于堆栈中,而动态数组位于堆中。虽然堆的内存管理是"灵活的",但堆栈不同:编译器需要能够确定堆栈中每个帧的大小。如果使用可变长度的数组,这显然是不可能的。另一方面,如果使用指针,则堆栈帧的大小是已知的(指针具有已知的大小),并且一切都很好。

如果你想尝试,这应该编译精细的

int (*m)[1000]=new int[oConstanta][1000]

因为它是一个固定大小的静态数组,其条目是动态分配的可变长度数组(允许)。

简言之:每当编译时对象的大小未知时,该对象就不能在堆栈中,就必须动态分配。

要制作一个具有连续元素和单个分配的动态大小的2D矩阵:

std::vector<int> matrix(Rows*Columns);

访问第i行和第j列中的元素:

matrix[Columns*i + j] = 1;

你可以在一节课上把这一切都总结起来。这里有一个非常基本的例子:

struct Matrix {
    std::vector<int> m;
    size_t rows,columns;
    Matrix(size_t rows,size_t columns)
      : rows(rows)
      , columns(columns)
      , m(rows*columns)
    {}
    int &at(size_t i,size_t j) {
        return m.at(i*columns + j);
    }
};