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

风来我也来 2013-02-17 04:05:03
环境: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.
...全文
299 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcp1505371914 2014-05-15
  • 打赏
  • 举报
回复
请问你这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. 用啥实现的
风来我也来 2013-02-19
  • 打赏
  • 举报
回复
百度了下大概明白字节对齐的意思,具体这里为什么加20字节不是很明白,能解说一下么?
风来我也来 2013-02-18
  • 打赏
  • 举报
回复
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 ,这个是什么意思,有什么用?
chanAlin 2013-02-18
  • 打赏
  • 举报
回复
引用 2 楼 yh880 的回复:
引用 1 楼 chanAlin 的回复:opencv2.0版本以下通常结束都要手动cvReleaseImage,否则会内存泄露的 我知道要释放,但这不是我的问题。我是故意不释放,来测试内存泄露多少。 我的问题是:为什么泄露的内存不是预期的大小,而是多出20字节。
或者这个还包括那个IplImage矩阵头吧。。。
fengbingchun 2013-02-18
  • 打赏
  • 举报
回复
需要字节对齐的原因
风来我也来 2013-02-17
  • 打赏
  • 举报
回复
引用 1 楼 chanAlin 的回复:
opencv2.0版本以下通常结束都要手动cvReleaseImage,否则会内存泄露的
我知道要释放,但这不是我的问题。我是故意不释放,来测试内存泄露多少。 我的问题是:为什么泄露的内存不是预期的大小,而是多出20字节。
chanAlin 2013-02-17
  • 打赏
  • 举报
回复
opencv2.0版本以下通常结束都要手动cvReleaseImage,否则会内存泄露的

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧