2016-12-01 61 views
0

我有以下代碼從緩衝區中打開OLE存儲。但它似乎導致內存泄漏。運行時消耗大量內存。
我不知道它在哪裏泄漏。StgStorage API中的C++內存泄漏

int OleCompoundBase::LoadFile(BYTE* buffer, int buffer_len) 
{ 
    dwOpenMode = STGM_READ | STGM_SHARE_EXCLUSIVE; // open stream mode 
    m_pRootStg = NULL; 

    // Load from buffer 
    ILockBytes *iLb = NULL; 
    HRESULT hres = CreateILockBytesOnHGlobal(NULL, true, &iLb); 
    if (hres == S_OK) { 
     ULARGE_INTEGER ui; 
     ui.LowPart = 0; 

     hres = iLb->WriteAt(ui, buffer, buffer_len, NULL); 
     if (hres == S_OK) { 
      hres = StgIsStorageILockBytes(iLb); 
      if (hres == S_OK) { 
       hres = StgOpenStorageOnILockBytes(iLb, NULL, STGM_READ | STGM_SHARE_DENY_READ, NULL, 0, &m_pRootStg); 
      } 
     } 
    } 
    iLb->Release(); 

    return hres; 
} 

m_pRootStg是釋放析構函數

+0

你試過路過TRUE;作爲第二個參數['CreateILockBytesOnHGlobal'](https://msdn.microsoft.com/en-us/庫/窗/桌面/ aa378977(v = vs.85)的.aspx)? –

+0

試過。它是一樣的 – xfr1end

回答

0

你是如何衡量這個泄露?只需在任務管理器中查看數字? m_pRootStg對象是否正常工作?

我不知道我是否願意稱之爲泄漏,但因爲你只設置ui.LowPart另一部分可能是非零和你都可能被寫入到一個大的偏移。如果要寫入緩衝區的起始位置,則應該使用ui.QuadPart = 0。如果這不會給你帶來麻煩,那麼你就會很幸運,並且在HighPart成員在內存中時,堆棧已經有0。

的另一個問題是,你不能調用的LoadFile方法不止一次,因爲你只是m_pRootStg = NULL;扔掉舊的對象(如果有的話)在你的代碼的開始。如果您呼叫的LoadFile多次,你應該將其更改爲

if (m_pRootStg) 
{ 
    m_pRootStg->Release(); 
    m_pRootStg = NULL; 
}