|
原因:
c++中不允许使用变量作为数组的长度定义数组,必须为常量值,c++中所有的内存需求都是在程序执行前通过定义的常量来确定的。
但是
我们有时候需要在程序运行时才能确定内存需求的变量值,例如所需值是由用户输入的等
比如在下面这个(不完整的)代码中,子函数中定义的二维数组的大小需要由形参frame来确定,frame.rows是一个变量
same2数组的内存大小是由kind决定的,erkind是一个变量(ps:这部分代码中没写出来)
int pixelFlag(cv::Mat &frame,int &num,vector<Point2f> &s,vector<Point2f> &e)//返回个数
{
//frame.
int kind=0,kindEnd=0,kindResult=0;//归类类别
vector<int> same1[2];//可疑边界目标
int edge[frame.rows][frame.cols];//表明边界属于哪个类
......
......
int same2[kind];memset(same2,0,sizeof(same2));
int sameEnd[kind];memset(sameEnd,0,sizeof(sameEnd));
解决办法:动态分配内存
c++中使用关键字new来进行动态内存申请,它是基于类型进行的,使用关键字delete进行内存释放
1.变量申请
Type *p=new Type;
...
delete p;
//也可以进行初始化
//例如
int *p=new int(2);//动态分配一个int的空间并初始化为3
2.一维数组申请
Type *p=new Type[n];
...
delete[] p;
//例如
int *p=new int[5];
...
delete[] p;
3.二维数组申请
Type **p=new Type*[m];
//数组p[m][n];
for(int i=0;i<m;++i)
{
p=new Type[n];
}
--------更新--------
之前我一直这样创建二维数组,然后使用memset将数组初始化为0,但是总是报错
int **edge = new int*[frame.rows];
for (int k = 0; k < frame.rows; ++k)
{
edge[k] = new int[frame.cols];
}
memset(edge, 0, sizeof(edge));
做了修改后,这样写就不报错了,暂时还没有搞懂为啥,仅供参考吧,弄清楚之后再更新
int **edge = new int*[frame.rows];
for (int k = 0; k < frame.rows; ++k)
{
edge[k] = new int[frame.cols];
memset(edge[k], 0, sizeof(int)*frame.cols);
}
————————————————
版权声明:本文为CSDN博主「不尽木」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42638401/article/details/88957796
|
|