OpenCV程序内存泄露的预防与检测

本文探讨了OpenCV程序中的内存泄露问题,包括内存泄露的概念、内存分配和释放,以及OpenCV 1.X和2.X版本中如何避免内存泄露。重点介绍了IplImage和Mat数据类型的内存管理,并推荐了Visual Leak Detect作为内存泄露检测工具。
摘要由CSDN通过智能技术生成

I. 内存泄露

    首先我们要搞清楚什么是内存泄露。一个应用程序在运行时占用内存区域可以分为五个:栈区、堆区、自由存储区、静态区、常量区(不讨论代码区)。栈(Stack)区存放局部变量,也就是在一个函数或代码段中定义的变量,局部变量由系统自动进行分配和释放;堆(Heap)区和自由存储区存放我们程序运行过程中动态分配的内存,主要由C语言的malloc函数和C++的new运算符进行分配(OpenCV中的cvCreateImage等函数正是调用了它们才能给图像分配一块存储区域),堆区中的内存空间不会被系统自动释放,使用完后需要由程序进行清理,如果堆区中的空间没有被程序释放,应用程序结束后系统才会回收这片区域;静态区存放全局变量和静态变量,静态区在程序开始时由系统自动分配,在程序运行过程中不改变,直到应用程序结束;常量区存放程序中定义的常量。

    栈区的大小是有上限的,所以我们不能在一个函数中定义过多的局部变量或过大的数组,如果一个函数中定义的局部变量所占用的内存之和超过一个阈值(这个阈值在不同系统和编译器中是不一样的,有些编译器如VS可以调整这个阈值),当程序执行到这个函数时就会提醒栈溢出(Stack Overflow,最著名的编程问答网站也叫这个名字,这个网站每月有几千万的活动用户帮你解答各种程序问题)。我们都知道平面图像其实就是一个二维数组,稍微大一点的图像就不可能作为局部变量存放在栈区,所以cvCreateImage等函数就在堆区中分配了一段内存空间,将图像的实际内容存储在里面,只把这段内存的首地址返回供我们使用。当我们分配了堆区空间,使用完后却忘记释放时,这段没有价值内存在应用程序运行过程中就会一直被占用,这就是内存泄露。随着应用程序的运行,内存泄露会越来越严重,直到耗尽全部物理内存或超过系统限制,程序就会报错退出。即使内存泄露没有严重到耗尽内存,也会拖慢程序的运行速度。由于图像处理程序会在内存堆区中多次分配大量的内存,稍微一不注意就可能造成严重的内存泄露,是内存泄露的重灾区。

II. 运算符new和delete的使用

    C语言中,使用malloc/free函数进行内存的分配和释放,C++中增加了new/delete运算符来完成这两项功能。new和delete的使用非常简单,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值