zoukankan      html  css  js  c++  java
  • openCV内存管理

    现在开始在工作中全面运用openCV~~现在发现一个不顺手的地方——很多时候申请的内存都得手动释放,现在在这里整理出需要手动释放的函数。

    cvLoadImage

    cvCloneImage

    cvCreateMat

    其内容都调用了 cvAlloc函数分配内存,故最后得手动释放。

    接下来介绍如何在openCV中实现自动内存管理。说到内存的自动管理,就会想到boost的shared_ptr,这里就介绍如何用shaprd_ptr管理openCV的内存。

    shared_ptr构造函数的第二个参数可以指定特定的释放函数。比如用类似方式构造对象 

      shared_ptr<IplImage> img=shared_ptr<IplImage>(cvLoadImage(filename),fun);

    最后img对象无效时,会自动调用fun(img)函数。

    用cvLoadImage建立的图片 img得用cvReleaseImage(&img)或者cvRelease(&img)释放。也就是得传入指针的地址,而不是指针本身,可上面fun()函数传入的是指针本身,所以不能用下面的形式:

    shared_ptr<IplImage> img=shared_ptr<IplImage>(cvLoadImage(filename),cvReleaseImage);

    而必须写个函数将上面的不同转化下,具体的fun如下:

       inline void fun(IplImage *img)
       {
            cvReleaseImage(&img);
       }

    这样即可实现用shared_ptr管理openCV的内存。可以将上面的释放函数用函数对象表示,具体如下,

        //可以考虑用一个函数对象来表示所有的释放
            struct ReleaseObj 
            {
            public:
                void operator ()(void *data)
                {
                    cvRelease(&data);
                }
            };
            const static ReleaseObj releaseObj; 

    这次即可用releaseObj,作为第二个参数传递给shared_ptr。

  • 相关阅读:
    zookeeper基础
    4. Zookeeper单机版安装
    3. 服务中间件Dubbo
    2. Maven工程的搭建
    Maven的优点
    应用架构的演进历史 MVC、 RPC、SOA 和 微服务架构
    js 正则表达式验证
    后台正则表达式验证部分部分总结
    Linux下记录登录用户历史操作
    Django使用Ace实现在线编辑器
  • 原文地址:https://www.cnblogs.com/xiangism/p/2792835.html
Copyright © 2011-2022 走看看