感觉本代码有内存遗漏若有一个资源 放入while(1000次)中, 内存只是增加了dwSize;
若有100个资源 放入while(1000次)中, 内存则增加约100*dwSize;/*
按资源的个数增加!不是按循环次数增加!
*//*-------------------------------------添加代码-------------------------------------*/
HRSRC hResInfo = NULL;
HGLOBAL hGloMem = NULL; //内存
HGLOBAL hGloRes = NULL; //资源
LPVOID pBuffer = NULL; //资源对应的指针
IStream *pstm;
hResInfo = ::FindResource(NULL, _T("P1"), RT_RCDATA); //查找资源 p1是资源名称
if(NULL != hResInfo)
{
----- DWORD dwSize = ::SizeofResource(NULL, hResInfo); //资源大小----- if(0 < dwSize)
----- {
---------- //CSDN Note: The handle must be allocated as movable and nondiscardable
---------- hGloMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_NODISCARD, dwSize+2); //按资源大小分配内存
---------- //此时内存增加了dwSize---------- DWORD dwAlloc = (DWORD)GlobalSize(hGloMem);
---------- //BYTE* pmem = (BYTE*)GlobalLock(hGloMem);---------- hGloRes = ::LoadResource(NULL, hResInfo);//加载资源
---------- pBuffer = ::LockResource(hGloRes);---------- memcpy(GlobalLock(hGloMem), pBuffer, dwSize); //将资源copy到内存中,此时内存 又 增加约dwSize
---------- dwAlloc = (DWORD)GlobalSize(hGloMem);---------- if(NULL != hGloMem)
---------- {
-------------------- if(S_OK != CreateStreamOnHGlobal(hGloMem, TRUE, &pstm)) //建立流对象
------------------------------ MessageBox(_T("Wrong"));
-------------------- }
-------------------- ::FreeResource(hGloRes);
-------------------- pstm->Release();
-------------------- ::GlobalUnlock(hGloMem);
-------------------- ::GlobalFree(hGloMem); //此时只释放了约dwSize, 也就是约遗漏dwSize内存---------- }
}
/*-------------------------------------添加代码-------------------------------------*/
GlobalAlloc分配的内存才需要释放,或者由GlobalFree释放,或者由IStream->Release来释放,取决于CreateStreamOnHGlobal的第二个参数。因为你设定的参数是TRUE,所以执行pstm->Release()时就会释放这个内存,不能再调用GlobalFree了,除非把第二个参数设置成FALSE,两种释放代码都需要调用。其实这段代码不需要单独构建一个hGloMem,直接从hGloRes获取IStream指针即可,内存不会增加,也不需要释放,但是IStream->Release是必须的。
---------------
怎么整这个指针啊!指示一下!整两天了!
LoadResource
CreateStreamOnHGlobal(..., FALSE, &pstm)
运行到CreateStreamOnHGlobal(..., FALSE, &pstm) 时提示:/*---------------------------------------------
Windows 已在 XX.exe 中触发一个断点。其原因可能是堆被损坏,这也说明 XX.exe 中或它所加载的任何 DLL 中有 bug。输出窗口可能提供了更多诊断信息
/*---------------------------------------------2:此时pstm根本没有数据
The pointer returned by LockResource is valid until the module containing the resource is unloaded. It is not necessary to unlock resources because the system automatically deletes them when the process that created them terminates.1. LoadResource
2. CreateStreamOnHGlobal
3. FreeResource不需要LockResource,GlobalAlloc等。
若我的图片作为资源加进来,每张5M,100张就500M了!
若50张,内存使用250M,那也够大的了!
能不能把它整进虚拟内存呢!