C++ GDI图像到IStream出现内存泄漏

我在写屏幕监控,使用隔行扫描算法,算法已经找好了,并且单独测试其中ScreenSpy就是隔行扫描算法的类,我单独测试过这个类没有内存泄漏但这段代码其他地方有没有内存泄漏?... 我在写屏幕监控,使用隔行扫描算法,算法已经找好了,并且单独测试
其中ScreenSpy 就是隔行扫描算法的类,我单独测试过 这个类没有内存泄漏
但这段代码其他地方有没有内存泄漏?,我看任务管理器 这段代码使用内存只增不减,不用这段代码就没事。。。。问题在哪?

//int x y 是成员变量
x=GetSystemMetrics(SM_CXSCREEN);
y=GetSystemMetrics(SM_CYSCREEN);
ScreenSpy.GetFirstScreen(x,y);
//GetSrcBit是我自己写的HDC转HBITMAP 这个函数没内存泄漏
HBITMAP MemPic=GetSrcBit(ScreenSpy.m_hdcPreCompatible,x,y);
//GDI初始化gdiplusToken、gdiplusStartupInput是GDI的两个成员变量
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
{
//encoderClsid也是成员变量
GetEncoderClsid(L"image/jpeg",&encoderClsid);
//encoderParameters也是成员变量
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
int quality = 100;
encoderParameters.Parameter[0].Value = &quality;
Bitmap bit(x, y), bit2(MemPic, NULL);
Graphics g(&bit);
g.ScaleTransform((float)x/x, (float)y/y);
g.DrawImage(&bit2, 0, 0);
IStream *pStream=NULL;
//这里是内存分配大小0是我不知道大小,我就用0试试,但也无错误,大家指导一下
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,0);
if (hMem == NULL) return ;
CreateStreamOnHGlobal(NULL, TRUE, &pStream);
if (pStream==NULL)
{
GlobalFree(hMem);
return;
}
bit.Save(pStream,&encoderClsid,&encoderParameters);
ULARGE_INTEGER ulongINT;
//GetStreamLength是我自己写的获得IStream大小,这个函数没有泄漏
GetStreamLength(pStream,&ulongINT);
//Width_Height_FirstScreenSize 是我自己定义的结构体
Width_Height_FirstScreenSize w_h_fss={0};
w_h_fss.width=GetSystemMetrics(SM_CXSCREEN);
w_h_fss.height=GetSystemMetrics(SM_CYSCREEN);
w_h_fss.FirstScreenSize=ulongINT.QuadPart;
int MemDataLen=sizeof(Width_Height_FirstScreenSize)+w_h_fss.FirstScreenSize;
char *MemData=new char[MemDataLen];
ZeroMemory(MemData,MemDataLen);
memcpy(MemData,&w_h_fss,sizeof(Width_Height_FirstScreenSize));
LARGE_INTEGER dlibMove = {0};
pStream->Seek(dlibMove,STREAM_SEEK_SET,NULL);
pStream->Read(MemData+sizeof(Width_Height_FirstScreenSize),w_h_fss.FirstScreenSize,NULL);
//SendData是发送内存图片给控制端 SendData没有内存泄漏
((CServerSocket*)pSocket)->SendData(((CServerSocket*)pSocket)->connectSK,SCREENMANAGEMENT,FIRSTSCREEN,MemDataLen,(char*)MemData);
GlobalFree(hMem);
pStream->Release();
delete[]MemData;
MemData=NULL;
}
GdiplusShutdown(gdiplusToken);

ScreenSpy.Release();
::DeleteObject(MemPic);

请大家帮忙看看 是不是我IStream初始化不行 还是IStream没释放,大家帮忙看看哪里内存泄漏了
展开
 我来答
635976510
推荐于2016-08-27 · TA获得超过114个赞
知道答主
回答量:43
采纳率:0%
帮助的人:57.5万
展开全部
我重新看了下你的代码,很可能是这一处问题:

GlobalFree(hMem);
pStream->Release();

上面这两句代码需要调换位置,一定要先调用pStream->Release()再调用GlobalFree(),GlobalFree函数将“尝试释放”掉hMem指向的内存,如果你的Release函数没有调用,这块内存的引用计数值仍是大于1的,将无法被GlobalFree成功释放掉。

详情请参考MSDN中对CreateStreamOnHGlobal函数的文档说明,当中有这样一句
http://msdn.microsoft.com/ZH-CN/library/windows/desktop/aa378980(v=vs.85).aspx

Do not free the hGlobal memory handle during the lifetime of the stream object. IStream::Release must be called before freeing the memory handle.

根据msdn的文档,你上述两句顺序是肯定有问题的,所以请你更正一下再做调试。如果执行之后还有问题,请再补充。
金色潜鸟
2013-01-03 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:6673万
展开全部
事件驱动程序,程序块往往是反复执行的,所以所有动态分配的量(包括createXX 之类函数生成的,例如 font, bitmap,结构),在程序块执行结束(特别是非常事件发生而 中途 return) 前都要释放。
内存泄漏不太好找,先处理小的图像,慢慢跟踪寻找吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式