热门标签 | 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.
用啥实现的

推荐阅读
  • STM32代码编写STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互。串口三配置串口一已 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • JavaSE 基础语法详解
    本文详细介绍了JavaSE的基础语法,涵盖数据类型、变量与常量、流程控制语句及数组等内容,旨在为初学者提供全面的学习指南。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 使用jQuery与百度地图API实现地址转经纬度功能
    本文详细介绍了如何利用jQuery和百度地图API将地址转换为经纬度,包括申请API密钥、页面构建及核心代码实现。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • Python网络编程:深入探讨TCP粘包问题及解决方案
    本文详细探讨了TCP协议下的粘包现象及其产生的原因,并提供了通过自定义报头解决粘包问题的具体实现方案。同时,对比了TCP与UDP协议在数据传输上的不同特性。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 本文探讨了在Eclipse中进行JavaScript验证时遇到的时间过长问题,并提供了解决方法。特别是对于使用ExtJS框架的用户,这一问题尤为突出。文章详细介绍了如何通过修改项目配置文件来有效解决这一问题。 ... [详细]
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社区 版权所有