bmp转iplimage出现内存泄露问题!!

camelisi 2011-04-21 03:19:30
我是用的采集卡的SDK采集位图数据的,这样写内存老是不能释放,每秒钟有40M内存泄露,函数外部调用cvReleaseImage也没有作用,基础太差,头都大了,有高手能帮忙看一下吗,谢谢了,下面是部分代码:



MV_IMAGEINFO info; // 自定义结构体,包含ULONG Length, nColor, Height, Width
MV_SetDeviceParameter(hdev, SET_GARBIMAGEINFO, (DWORD)&info);
PVOID ptr = malloc(info.Length);
memset(ptr, 0, info.Length);
ptr = MV_CaptureSingle(CurBoard, FALSE, NULL, 0, &info); // 采集一幅未处理图像
int imageSize = info.Height * ((info.Width * 4 + 3) & (-4));
IplImage *frame = cvCreateImageHeader(cvSize(info.Width, info.Height), IPL_DEPTH_8U, 4);
frame->imageData = (char *)malloc(imageSize);
ULONG color = info.nColor;
memcpy(frame->imageData, (char *)ptr , imageSize);
free(ptr); // 这里崩了,提示 Exception:_CrtIsValidHeapPointer(pUserData)
...全文
191 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
camelisi 2011-04-21
  • 打赏
  • 举报
回复
问题解决,是另一个同事的代码内存也泄露了= =!已经修复,十分谢谢鹦鹉,40分拱手送上,不成敬意
camelisi 2011-04-21
  • 打赏
  • 举报
回复
十分谢谢鹦鹉
刚发现还有这里frame->imageData = (char *)malloc(imageSize);
也分配了内存,结果cvReleaseImage()释放的也是frame指向的那部分内存,imageData在release后又有部分内存地址不明确。。。在cvRelease之前加上free(frame->imageData)后解决了这个问题,结果还存在内存泄露,每秒1-3M,简直了啊。。我再跟
camelisi 2011-04-21
  • 打赏
  • 举报
回复
鹦鹉说的没错,确实是这样- -!
我将上面这段改成
[code=C/C++]
PVOID ptr = MV_CaptureSingle(CurBoard, false, NULL, 0, &info);

这离就不会有内存泄露了,但是貌似还有别的地方泄露了。。正在单步跟踪
快乐鹦鹉 2011-04-21
  • 打赏
  • 举报
回复
PVOID ptr = malloc(info.Length);
memset(ptr, 0, info.Length);
ptr = MV_CaptureSingle(CurBoard, FALSE, NULL, 0, &info);
====
看看你这段代码,先为ptr指针申请了空间,接着又将MV_CaptureSingle函数的返回值复制给ptr,那么不就把ptr前面指向的地址覆盖掉了么?这样前面用malloc分配的空间就永远没办法回收了,因为你已经不知道它的地址。

19,468

社区成员

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

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