template <typename T> void Mat<T>::Read(char *ImageName) //从硬盘文件中读入图像数据; { IplImage *img =cvLoadImage( ImageName , 0); T *img_data = (T *)(img->imageData); //原因在这里! int width_step=img->widthStep; width=img->width; height=img->height; data=new T *[height]; for(int i=0;i<height;i++) { data[i]=new T [width]; } for(int i=0;i<height;i++) { for(int j=0;j<width;j++) { data[i][j]=img_data[width_step*i+j];//提示访问越界(此时i=266,j=467 图片的高度为480,宽度512) } } cvReleaseImage( &img ); }
此函数是模版类的成员函数(在类外定义时,写成模板函数),此模版函数在实例化时模板类型T被实例化为double,运行时提示访问越界(如上),其原因是: 由Iplimage 结构体的定义知 对imgData存储的是char类型, 如果强制转换成T类型(此处为double类型),将导致寻址方式改变(指针移动到下一位所越过的字节数变多了),所以导致了访问了越界的内存!
c++ 很隐蔽的指针访问越界的情况---在强制类型转换中发生
最新推荐文章于 2023-03-21 20:36:16 发布