点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

引子

2020年第二篇技术文章,最近比较忙,事情比较多,搞了一个新的系列技术文章,还没有完整的搞好,抽空写一篇最近别人问我的事情!

概述

如果你是OpenCV框架做开发、特别是用OpenCV C++版本或者Java/Android版本JNI的调用的化,可能很多时候你遇到最棘手的问题就是程序运行会越来越慢,甚至死机了,原因很简单,有时候你有内存泄漏问题。做好下面几件事情会帮助你在开发中经可能的避免OpenCV对象内存泄漏陷阱。

记得调用release

OpenCV中很多数据结构与对象都有一个release方法,记得用完这些对象跟数据容器之后调用release/destory方法。最典型的就是Mat对象的release方法,调用release并不会重根本上保证立刻回收内存,它只是让对象的引用计数减一,只有当对象的引用计数为0的时候,才会回收内存。此外release方法还是一个原子操作,也可以线程中被调用。这些方法对象列表如下:

  • Mat的release方法,表示释放图像内存

  • FileStorage的releaseAndGetString方法,表示关闭文件,释放所有内存

  • Mat继承类/封装类,UMat、SparseMat等都调用release方法

  • VideoCapture/VideoWriter方法,调用release释放缓冲区与资源

  • CUDA相关的调用releaseMemory方法,比如SURF_CUDA

  • rgbd相关的调用releasePyramids方法

  • 使用allocate分配内存的必须调用free()方法

对照一下,你平时有注意过这些不,没有的话从现在开始还来得及的!

滥用/重用变量导致内存泄漏

注意要避免下面三种错误代码写法

错误一:

1Mat m1;2for (int i = 0; i 100; i++) {3         m1 = Mat::zeros(Size(512, 512), CV_8UC3);4}5imshow("input-m1", m1);6m1.release();

错误方式:在循环中创建无数Mat对象,结果只释放了一个,很多人的循环就是这么写的,妥妥的内存泄漏!类似的代码操作应该避免。

错误二:

1Mat image = imread("D:/images/test.png");2image = getProcessed();3imshow("input-image", image);

错误方式:以为可以少创建一个变量,结果是无法释放内存了,反复调用导致内存泄漏,类似的代码应该避免。

错误三:

有返回Mat对象,但是提前调用release释放了,结果再次访问data数据块,导致程序直接崩溃!需要特别注意!简单演示如下:

 1#include  2#include  3 4using namespace std; 5using namespace cv; 6Mat my_process(); 7int main(int argc, char** argv) { 8    // 错误三: 9    Mat image = my_process();10    imshow("input-image", image);11    waitKey(0);12}13Mat my_process() {14     Mat m1 = Mat::zeros(Size(512, 512), CV_8UC3);15     // TODO: do something here16     m1.release();17     return m1;18}

总结

使用C++开发,内存跟指针问题是很多开发者头疼的一件事情,OpenCV框架对内存的管理已经很智能化了,基本上代码规范写,记得release就不会有这个方面的问题,但是还是小心为妙,特别是跨语言调用的时候比如Android/Java通过JNI调用OpenCV函数,如果不注意release或者没有正确release,很难找到原因!

最重要的一句话,记得release/free,欢迎留言分享你的观点与想法!

 推荐阅读 

2019原创技术文章汇总

2018年原创技术文章汇总

OpenCV实战 | 噪声生成与图像加噪声

OpenCV4系统化学习路线图-视频版本!

java opencv bytearray转mat_OpenCV开发中的内存管理问题相关推荐

  1. 拒绝内存泄露,谈一些纯代码iPhone开发中的内存管理

    笔者刚从学校出来,算上实习期,接触iPhone开发已有半载,也算是对iPhone(iOS)开发中的内存管理有了些认识,由于开发中一直没有用Interface Builder,本文就谈谈纯代码iPhon ...

  2. Unity游戏开发中的内存管理_资料

    http://mp.weixin.qq.com/mp/homepage?__biz=MzAwMTUzOTczNQ==&hid=6&sn=44228b7260d7a5a3287a4499 ...

  3. Swift 中的内存管理详解

    这篇文章是在阅读<The Swift Programming Language>Automatic Reference Counting(ARC,自动引用计数)一章时做的一些笔记,同时参考 ...

  4. JVM基础 之Java HotSpot虚拟机中的内存管理

    1  简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...

  5. Web开发中的图片管理:策略与实践

    前言 在Web开发中,图像是无法忽视的重要组成部分.然而,随着图片数量的增加和高清图像的普及,图片管理变得越来越复杂.在这篇文章中,我们将详细探讨Web开发中的图片管理策略和实践,包括图片优化.存储. ...

  6. 形式参数内存在哪java_深入浅出Java中JVM内存管理

    原标题:深入浅出Java中JVM内存管理 Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC ...

  7. java jvm内存模型_Java(JVM)内存模型– Java中的内存管理

    java jvm内存模型 Understanding JVM Memory Model, Java Memory Management are very important if you want t ...

  8. 分布式存储开发:Curve中的内存管理

    前言 Curve 实践过程中遇到过几次内存相关的问题,与操作系统内存管理相关的是以下两次: chunkserver 上内存无法释放 mds 出现内存缓慢增长的现象 内存问题在开发阶段大多很难发现,测试 ...

  9. 游戏开发中的道具管理

    前言 在开发游戏的时候,我们肯定会处理道具,不论是多大的游戏都有道具.道具的管理方式也是多种多样.下面记录一下我个人在游戏开发中的道具管理方式. 道具的定义 道具的属性基本分为: ID.类型.数量.图 ...

最新文章

  1. 看人装X,我就来气,开启极限装X模式
  2. 操作Docker容器
  3. 网络:HTTP1.1和HTTP2区别
  4. Java探索之旅(6)——对象和类
  5. Kafka:集群部署
  6. leetcode —— 面试题 16.19. 水域大小
  7. ASP.Net Web 服务 – 如何使用会话状态
  8. C/C++ 控制台输入
  9. Linux的slab和nginx的区别,nginx中slab机制理解
  10. bochs运行xp_bochs xp 镜像下载|bochs xp精简版下载_ - 极光下载站
  11. rfid水洗电子标签怎么管理洗涤衣物
  12. xml转json(使用工具)
  13. 面试题-取出url中的参数以json对象结构输出(JavaScript)
  14. 分页虚拟存储管理——页面置换算法例题
  15. EasyExcel报错空指针异常
  16. 深入BBN,如何解决长尾数据分布的同时兼顾表示学习
  17. 查看github星数排行榜
  18. 点盾云播放视频没声音了怎么办?
  19. DHU OJ 27 约瑟夫环
  20. 干货 | 携程微信小程序如何进行Size治理

热门文章

  1. 即将直播:新一代大数据技术构建PB级云端数仓实践
  2. 腾讯AI Lab宣布将于9月底开源“Tencent ML-Images”项目
  3. FFMPEG使用参数详解
  4. linux 调优篇 :硬件调优(BIOS配置)* 壹
  5. go语言for循环中修改临时变量无效
  6. 如何将rdd导入数据库中【简单实例】
  7. Hadoop 03_核心:读写流程
  8. java小编程----电话号码组合
  9. leetcode 43. Multiply Strings | 43. 字符串相乘(Java)
  10. 遇到的坑_新手搭建web自动化遇到的坑...