
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没释放,大家帮忙看看哪里内存泄漏了 展开
其中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没释放,大家帮忙看看哪里内存泄漏了 展开
2个回答
展开全部
我重新看了下你的代码,很可能是这一处问题:
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的文档,你上述两句顺序是肯定有问题的,所以请你更正一下再做调试。如果执行之后还有问题,请再补充。
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的文档,你上述两句顺序是肯定有问题的,所以请你更正一下再做调试。如果执行之后还有问题,请再补充。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询