directdraw程序内存泄漏,咋回事? 一个VOD程序,每次重画界面的时候就内存泄漏。有遇到过类似情况的吗?程序不是我写的,改起来一点头绪没有,郁闷啊顺便祝大家新年好 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是有忘记删除、释放原来用的内存;new出来的一定要delete掉。指针用完后要附空。 我全文搜索过了所有的new,malloc等关键字,用的不多,也全部都释放了啊,非常郁闷 1、用最新版的 DXSDK(如DX8.1)试一试。2、或者:注意new,delete的顺序及DirectDraw的Release顺序按后出先放(如堆栈)试一试。低版本的DX一定要遵守Release的顺序。 我看过一篇文档,是说关于DIRECTSHOW内存泄漏的。据说两个Filter之间的PIN是共用同一块内存的。所以每一个filter都有可能发生内存泄漏。我也不知道怎么解决。 现在查出来是在读取界面图片的函数中发生的内存泄漏。但是就是不知道是怎么造成的。下面是代码,哪位大侠指点一二?LPPICTURE LoadPic(CHAR* szFile){ IStorage* storage; IStream* stream; DWORD size=0; WCHAR filename[MAX_PATH]; MultiByteToWideChar(CP_ACP, 0, szFile, -1, filename, MAX_PATH * sizeof(WCHAR)); StgOpenStorage( L"1.dat", NULL, STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, 0, &storage); storage->OpenStream( filename, NULL, STGM_READ|STGM_SHARE_EXCLUSIVE, 0, &stream); STATSTG state; stream->Stat(&state,STATFLAG_DEFAULT); DWORD length=(DWORD)state.cbSize.QuadPart; LPVOID pvData = NULL; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, length); pvData = GlobalLock(hGlobal); stream->Read(pvData,length,&size); if (size<length) throw 0; GlobalUnlock(hGlobal); stream->Release(); storage->DestroyElement(L"1.dat"); storage->Release(); LPSTREAM pstm = NULL; HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); LPPICTURE gpPicture; hr = ::OleLoadPicture(pstm, length, FALSE, IID_IPicture, (LPVOID *)&gpPicture); pstm->Release(); DeleteObject(pstm); DeleteObject(hGlobal); return gpPicture;} 谢谢大家的关心,yzx0023(我会我可以):boundschecker我用了,可是设置显示属性时候进行不下去,我只好用msgbox慢慢测试了。Richuen22(更深蓝) 我已经用了directx 8.1 sdk了 laijunchen(Justin) 这个不是在播放视频文件的时候造成的,就是切换界面时候造成的啊。 回复人:matchboy(常常低着头) () 信誉:100 2003-1-3 13:16:37 删除 现在查出来是在读取界面图片的函数中发生的内存泄漏。但是就是不知道是怎么造成的。下面是代码,哪位大侠指点一二? LPPICTURE LoadPic(CHAR* szFile) { IStorage* storage; IStream* stream; DWORD size=0; WCHAR filename[MAX_PATH]; MultiByteToWideChar(CP_ACP, 0, szFile, -1, filename, MAX_PATH * sizeof(WCHAR)); StgOpenStorage( L "1.dat ", NULL, STGM_DIRECT ¦STGM_READWRITE ¦STGM_SHARE_EXCLUSIVE, NULL, 0, &storage); storage- >OpenStream( filename, NULL, STGM_READ ¦STGM_SHARE_EXCLUSIVE, 0, &stream); STATSTG state; stream- >Stat(&state,STATFLAG_DEFAULT); DWORD length=(DWORD)state.cbSize.QuadPart; LPVOID pvData = NULL; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, length); pvData = GlobalLock(hGlobal); stream- >Read(pvData,length,&size); if (size <length) throw 0; GlobalUnlock(hGlobal); stream- >Release(); storage- >DestroyElement(L "1.dat "); storage- >Release(); LPSTREAM pstm = NULL; HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); LPPICTURE gpPicture; hr = ::OleLoadPicture(pstm, length, FALSE, IID_IPicture, (LPVOID *)&gpPicture); pstm- >Release(); DeleteObject(pstm); DeleteObject(hGlobal); return gpPicture; } 回复人:matchboy(常常低着头) () 信誉:100 2003-1-3 13:21:47 删除 谢谢大家的关心, yzx0023(我会我可以):boundschecker我用了,可是设置显示属性时候进行不下去,我只好用msgbox慢慢测试了。 Richuen22(更深蓝) 我已经用了directx 8.1 sdk了 laijunchen(Justin) 这个不是在播放视频文件的时候造成的,就是切换界面时候造成的啊。 粗看了一下,发觉这里: GlobalUnlock(hGlobal); . . . DeleteObject(hGlobal); //这句应有错应是如此释放:DeleteObject(hGlobal); 改为GlobalFree(hGlobal);若如此再有问题再讲一声。 更深蓝,谢谢你的回复!:)我改成用GlobalFree了: pstm->Release(); DeleteObject(pstm); GlobalFree(hGlobal); //cmd1 DeleteObject(hGlobal); //cmd2原来我是这样写的,可是发现我注释了cmd1,cmd2和不注释都一样,好像释放语句不起作用一样。不知道怎么了。是不是前面的一些操作导致申请的空间无法释放?LPPICTURE LoadPic(CHAR* szFile) { IStorage* storage; IStream* stream; DWORD size=0; WCHAR filename[MAX_PATH]; MultiByteToWideChar(CP_ACP, 0, szFile, -1, filename, MAX_PATH * sizeof(WCHAR)); StgOpenStorage( L "1.dat ", NULL, STGM_DIRECT ¦STGM_READWRITE ¦STGM_SHARE_EXCLUSIVE, NULL, 0, &storage); storage- >OpenStream( filename, NULL, STGM_READ ¦STGM_SHARE_EXCLUSIVE, 0, &stream); STATSTG state; stream- >Stat(&state,STATFLAG_DEFAULT); DWORD length=(DWORD)state.cbSize.QuadPart; LPVOID pvData = NULL; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, length); pvData = GlobalLock(hGlobal); stream- >Read(pvData,length,&size); if (size <length) throw 0; GlobalUnlock(hGlobal); stream- >Release(); storage- >DestroyElement(L "1.dat "); storage- >Release(); LPSTREAM pstm = NULL; HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); LPPICTURE gpPicture; hr = ::OleLoadPicture(pstm, length, FALSE, IID_IPicture, (LPVOID *)&gpPicture); pstm- >Release(); DeleteObject(pstm); GlobalFree(hGlobal); //加上去 return gpPicture; } 更深蓝,今天不知道怎么了,发送短消息给你也发送失败了,寒ing。希望你能早点看到俺的帖子。:) 关于SVN,大家给我简单介绍下吧 新手很弱的问题 CButton 不响应单击事件 关于树形控件显示“+”的问题 请教DIB结构体 BITMAPINFOHEADER 的问题。 高手请进 正在用完成端口开发一个代理服务器,中间遇到了很多的问题,请大家指点进 请问一下关于在主框架写字符的函数 急问关于LISTCTRL? 各位大虾,求购虚拟光碟的技术资料或源代码,SOS! 高手救命,如何在用户线程向主线程发送消息时,传回一个字符串,真是急死了,传地址总是不对 关于头文件 不知道怎么的,这样的调用会出错,-----断言! 关于 对话框简单问题,程序死掉了~~~
指针用完后要附空。
非常郁闷
2、或者:
注意new,delete的顺序及DirectDraw的Release顺序按后出先放(如堆栈)试一试。低版本的DX一定要遵守Release的顺序。
据说两个Filter之间的PIN是共用同一块内存的。
所以每一个filter都有可能发生内存泄漏。
我也不知道怎么解决。
LPPICTURE LoadPic(CHAR* szFile)
{
IStorage* storage;
IStream* stream;
DWORD size=0;
WCHAR filename[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, szFile, -1, filename, MAX_PATH * sizeof(WCHAR));
StgOpenStorage(
L"1.dat",
NULL,
STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE,
NULL,
0,
&storage);
storage->OpenStream(
filename,
NULL,
STGM_READ|STGM_SHARE_EXCLUSIVE,
0,
&stream);
STATSTG state;
stream->Stat(&state,STATFLAG_DEFAULT);
DWORD length=(DWORD)state.cbSize.QuadPart;
LPVOID pvData = NULL;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, length);
pvData = GlobalLock(hGlobal);
stream->Read(pvData,length,&size);
if (size<length) throw 0;
GlobalUnlock(hGlobal);
stream->Release();
storage->DestroyElement(L"1.dat");
storage->Release();
LPSTREAM pstm = NULL;
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
LPPICTURE gpPicture;
hr = ::OleLoadPicture(pstm, length, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
pstm->Release();
DeleteObject(pstm);
DeleteObject(hGlobal);
return gpPicture;
}
yzx0023(我会我可以):boundschecker我用了,可是设置显示属性时候进行不下去,我只好用msgbox慢慢测试了。
Richuen22(更深蓝) 我已经用了directx 8.1 sdk了
laijunchen(Justin) 这个不是在播放视频文件的时候造成的,就是切换界面时候造成的啊。
现在查出来是在读取界面图片的函数中发生的内存泄漏。但是就是不知道是怎么造成的。下面是代码,哪位大侠指点一二?
LPPICTURE LoadPic(CHAR* szFile)
{
IStorage* storage;
IStream* stream;
DWORD size=0;
WCHAR filename[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, szFile, -1, filename, MAX_PATH * sizeof(WCHAR));
StgOpenStorage(
L "1.dat ",
NULL,
STGM_DIRECT ¦STGM_READWRITE ¦STGM_SHARE_EXCLUSIVE,
NULL,
0,
&storage);
storage- >OpenStream(
filename,
NULL,
STGM_READ ¦STGM_SHARE_EXCLUSIVE,
0,
&stream);
STATSTG state;
stream- >Stat(&state,STATFLAG_DEFAULT);
DWORD length=(DWORD)state.cbSize.QuadPart;
LPVOID pvData = NULL;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, length);
pvData = GlobalLock(hGlobal);
stream- >Read(pvData,length,&size);
if (size <length) throw 0;
GlobalUnlock(hGlobal);
stream- >Release();
storage- >DestroyElement(L "1.dat ");
storage- >Release();
LPSTREAM pstm = NULL;
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
LPPICTURE gpPicture;
hr = ::OleLoadPicture(pstm, length, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
pstm- >Release();
DeleteObject(pstm);
DeleteObject(hGlobal);
return gpPicture;
}
回复人:matchboy(常常低着头) () 信誉:100 2003-1-3 13:21:47 删除
谢谢大家的关心,
yzx0023(我会我可以):boundschecker我用了,可是设置显示属性时候进行不下去,我只好用msgbox慢慢测试了。
Richuen22(更深蓝) 我已经用了directx 8.1 sdk了
laijunchen(Justin) 这个不是在播放视频文件的时候造成的,就是切换界面时候造成的啊。
GlobalUnlock(hGlobal);
.
.
.
DeleteObject(hGlobal); //这句应有错
应是如此释放:
DeleteObject(hGlobal);
改为
GlobalFree(hGlobal);
若如此再有问题再讲一声。
我改成用GlobalFree了:
pstm->Release();
DeleteObject(pstm);
GlobalFree(hGlobal); //cmd1
DeleteObject(hGlobal); //cmd2
原来我是这样写的,可是发现我注释了cmd1,cmd2和不注释都一样,好像释放语句不起作用一样。不知道怎么了。
是不是前面的一些操作导致申请的空间无法释放?LPPICTURE LoadPic(CHAR* szFile)
{
IStorage* storage;
IStream* stream;
DWORD size=0;
WCHAR filename[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, szFile, -1, filename, MAX_PATH * sizeof(WCHAR));
StgOpenStorage(
L "1.dat ",
NULL,
STGM_DIRECT ¦STGM_READWRITE ¦STGM_SHARE_EXCLUSIVE,
NULL,
0,
&storage);
storage- >OpenStream(
filename,
NULL,
STGM_READ ¦STGM_SHARE_EXCLUSIVE,
0,
&stream);
STATSTG state;
stream- >Stat(&state,STATFLAG_DEFAULT);
DWORD length=(DWORD)state.cbSize.QuadPart;
LPVOID pvData = NULL;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, length);
pvData = GlobalLock(hGlobal);
stream- >Read(pvData,length,&size);
if (size <length) throw 0;
GlobalUnlock(hGlobal);
stream- >Release();
storage- >DestroyElement(L "1.dat ");
storage- >Release();
LPSTREAM pstm = NULL;
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
LPPICTURE gpPicture;
hr = ::OleLoadPicture(pstm, length, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
pstm- >Release();
DeleteObject(pstm);
GlobalFree(hGlobal); //加上去
return gpPicture;
}
希望你能早点看到俺的帖子。:)