在C++中的类的方法中传输动态分配的矩阵
Transfering a dynamically allocated matrix in a method of a class in C++
我试图制作一个动态分配的可变大小二维数组,但我不知道为什么如果我创建自己的常数值,它就无法编译:
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::vector
s的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);
}
};
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 动态分配的数组通过引用传输到函数
- 在C++中的类的方法中传输动态分配的矩阵