一个图像处理的项目运行时没有问题,最后关掉显示的图片时提醒触发一个断点,点击继续则出现以下画面:
断点停留在释放指针的那一行。究其原因如下:
1.错用free释放IplImage*
IplImage* input = cvLoadImage("data/LOGO/2_1.jpg");//待测图
IplImage* test = cvLoadImage("data/LOGO/1_1.jpg"); //基准图
free(input);
free(test);
IplImage*是opencv里面用于存储图像的结构,不能用free来释放。应该如下:
cvReleaseImage(&input);
cvReleaseImage(&test);
2、malloc与free不对应
unsigned char* colors1 = (unsigned char*)input->imageData;
unsigned char* colors2 = (unsigned char*)test->imageData;
free(colors1);
free(colors2);
一个malloc对应一个free,而上述指针不是用malloc申请的动态内存空间,所以不能用free去释放。但怎么处理不知道,先注释掉了。
3、注意循环里面动态申请的内存空间 需要在循环里面释放,不能在程序结尾才释放。
4、new和delete相对应
double *homo = new double[9];//数组
delete[] homo;
int *count1 = new int;//一个变量
delete count1;
注意delete的用法不是:delete(homo),不知道为什么这样写没出错。
5、二维数组循环申请的需要循环释放
int **a =(int**)malloc(sizeof(int*)*3);//为二维数组分配3行for (i = 0; i < 3; ++i)//为每列分配4个大小空间{ a[i] = (int*)malloc(sizeof(int)*4);}//释放动态开辟的空间for (int i = 0; i < 3; ++i){free(a[i]);}free(a);
int num = 3;(int*)* array = new int*[num]; // 申请int*类型数组的内存空间,赋值给(int*)*类型的arrayfor(int i=0; i<num; ++i) {array[i] = new int[num]; // 分别给int*类型的数组申请空间,即一维数组的动态申请。}for(int i=0; i<num; i++) //释放{delete[] array[i];}delete[] array;
6、指针释放很重要!!!
在平时写小程序的时候注意不到,不释放也没什么影响,但是一旦到做大项目的时候,指针内存的问题会让人很崩溃。