C及opencv指针释放问题

    一个图像处理的项目运行时没有问题,最后关掉显示的图片时提醒触发一个断点,点击继续则出现以下画面:


断点停留在释放指针的那一行。究其原因如下:

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*)*类型的array
  for(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、指针释放很重要!!!
   在平时写小程序的时候注意不到,不释放也没什么影响,但是一旦到做大项目的时候,指针内存的问题会让人很崩溃。



发布了87 篇原创文章 · 获赞 90 · 访问量 27万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览