热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

opencvIplImage创建后未释放寻求解决疑惑。

环境:opencv2.4.2+VS2008C++环境+XP使用示例如下:IplImage*imgcvCreateImage(width,height,IPL_DEPTH_8U
环境:opencv2.4.2+ VS2008C++环境 + XP
使用示例如下:
IplImage * img = cvCreateImage(width,height,IPL_DEPTH_8U,1);

在程序结束代码,没有相应的示例代码,预期泄露情况如下:
大块图像: (width * 通道数 + 3 )/4*4 * height 
图像结构体泄露: IplImage 总共占用112字节,泄露 112字节 。

实际泄露情况是:
大块图像: (width * 通道数 + 3 )/4*4 * height   + 20 字节 。
图像结构体泄露:  112 + 20 字节 。

请问:这俩个 20字节 是哪方面导致的内存泄露?

已经确认,任意改变 宽度和高度,通道数,都会多出20字节。

例如,一副 640*480,单通道8位图像,以及 640*480,三通道8位图像,程序退出时俩幅图像内存泄露如下:
Detected memory leaks!
Dumping objects ->
{921} normal block at 0x06AFC268, 307220 bytes long.
 Data: <    h           > CD CD CD CD 68 C2 AF 06 00 00 00 00 00 00 00 00 
{920} normal block at 0x0650A888, 132 bytes long.
 Data: <      P p       > CD CD CD CD 88 A8 50 06 70 00 00 00 00 00 00 00 
{917} normal block at 0x01EF0040, 921620 bytes long.
 Data: <            @   > CD CD CD CD CD CD CD CD CD CD CD CD 40 00 EF 01 
{916} normal block at 0x0650A708, 132 bytes long.
 Data: <      P p       > CD CD CD CD 08 A7 50 06 70 00 00 00 00 00 00 00 
Object dump complete.

7 个解决方案

#1


opencv2.0版本以下通常结束都要手动cvReleaseImage,否则会内存泄露的

#2


引用 1 楼 chanAlin 的回复:
opencv2.0版本以下通常结束都要手动cvReleaseImage,否则会内存泄露的

我知道要释放,但这不是我的问题。我是故意不释放,来测试内存泄露多少。
我的问题是:为什么泄露的内存不是预期的大小,而是多出20字节。

#3


引用 2 楼 yh880 的回复:
引用 1 楼 chanAlin 的回复:opencv2.0版本以下通常结束都要手动cvReleaseImage,否则会内存泄露的
我知道要释放,但这不是我的问题。我是故意不释放,来测试内存泄露多少。
我的问题是:为什么泄露的内存不是预期的大小,而是多出20字节。


或者这个还包括那个IplImage矩阵头吧。。。

#4


IplImage矩阵头是112字节,内存泄露却是132字节。
图像本身泄露也是多20字节。
跟踪到源代码,最后指向  ....\opencv2.4.2\opencv\modules\core\src\alloc.cpp文件的如下函数:
void* fastMalloc( size_t size )
{
    uchar* udata = (uchar*)malloc(size + sizeof(void*) + CV_MALLOC_ALIGN);
    if(!udata)
        return OutOfMemoryError(size);
    uchar** adata = alignPtr((uchar**)udata + 1, CV_MALLOC_ALIGN);
    adata[-1] = udata;
    return adata;
}

多出的20字节就是sizeof(void*) + CV_MALLOC_ALIGN ,这个是什么意思,有什么用?

#5


需要字节对齐的原因

#6


百度了下大概明白字节对齐的意思,具体这里为什么加20字节不是很明白,能解说一下么?

#7


请问你这Detected memory leaks!
Dumping objects ->
{921} normal block at 0x06AFC268, 307220 bytes long.
 Data: <    h           > CD CD CD CD 68 C2 AF 06 00 00 00 00 00 00 00 00 
{920} normal block at 0x0650A888, 132 bytes long.
 Data: <      P p       > CD CD CD CD 88 A8 50 06 70 00 00 00 00 00 00 00 
{917} normal block at 0x01EF0040, 921620 bytes long.
 Data: <            @   > CD CD CD CD CD CD CD CD CD CD CD CD 40 00 EF 01 
{916} normal block at 0x0650A708, 132 bytes long.
 Data: <      P p       > CD CD CD CD 08 A7 50 06 70 00 00 00 00 00 00 00 
Object dump complete.
用啥实现的

推荐阅读
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文深入探讨了C++对象模型中的一些细节问题,特别是虚拟继承和析构函数的处理。通过具体代码示例和详细分析,揭示了书中某些观点的不足之处,并提供了更合理的解释。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文探讨了在 OpenStack 环境中使用虚拟机部署 Ceph 集群后,外部服务器通过浮动 IP 无法访问该集群的问题,并提供了详细的解决方案。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • HBase运维工具全解析
    本文深入探讨了HBase常用的运维工具,详细介绍了每种工具的功能、使用场景及操作示例。对于HBase的开发人员和运维工程师来说,这些工具是日常管理和故障排查的重要手段。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
author-avatar
小涵竹叶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有