一个VOD程序,每次重画界面的时候就内存泄漏。有遇到过类似情况的吗?
程序不是我写的,改起来一点头绪没有,郁闷啊顺便祝大家新年好

解决方案 »

  1.   

    是不是有忘记删除、释放原来用的内存;new出来的一定要delete掉。
    指针用完后要附空。
      

  2.   

    我全文搜索过了所有的new,malloc等关键字,用的不多,也全部都释放了啊,
    非常郁闷
      

  3.   

    1、用最新版的 DXSDK(如DX8.1)试一试。
    2、或者:
    注意new,delete的顺序及DirectDraw的Release顺序按后出先放(如堆栈)试一试。低版本的DX一定要遵守Release的顺序。
      

  4.   

    我看过一篇文档,是说关于DIRECTSHOW内存泄漏的。
    据说两个Filter之间的PIN是共用同一块内存的。
    所以每一个filter都有可能发生内存泄漏。
    我也不知道怎么解决。
      

  5.   

    现在查出来是在读取界面图片的函数中发生的内存泄漏。但是就是不知道是怎么造成的。下面是代码,哪位大侠指点一二?
    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;
    }
      

  6.   

    谢谢大家的关心,
    yzx0023(我会我可以):boundschecker我用了,可是设置显示属性时候进行不下去,我只好用msgbox慢慢测试了。
    Richuen22(更深蓝) 我已经用了directx 8.1 sdk了
     laijunchen(Justin) 这个不是在播放视频文件的时候造成的,就是切换界面时候造成的啊。
      

  7.   

    回复人: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  &brvbar;STGM_READWRITE  &brvbar;STGM_SHARE_EXCLUSIVE,  
                           NULL,  
                           0,  
                           &storage);  
                 
               storage-  >OpenStream(  
                           filename,  
                           NULL,  
                           STGM_READ  &brvbar;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)  这个不是在播放视频文件的时候造成的,就是切换界面时候造成的啊。  
      

  8.   

    粗看了一下,发觉这里:
       GlobalUnlock(hGlobal);  
              .
              .
              .
      DeleteObject(hGlobal); //这句应有错
    应是如此释放:
    DeleteObject(hGlobal); 
    改为
    GlobalFree(hGlobal);
    若如此再有问题再讲一声。
      

  9.   

    更深蓝,谢谢你的回复!:)
    我改成用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  &brvbar;STGM_READWRITE  &brvbar;STGM_SHARE_EXCLUSIVE,  
                           NULL,  
                           0,  
                           &storage);  
                 
               storage-  >OpenStream(  
                           filename,  
                           NULL,  
                           STGM_READ  &brvbar;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;  
    }  
      

  10.   

    更深蓝,今天不知道怎么了,发送短消息给你也发送失败了,寒ing。
    希望你能早点看到俺的帖子。:)