2016-12-01 2 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

にそれを変更する必要がありますが、[ 'CreateILockBytesOnHGlobal'](https://msdn.microsoft.com/en-us/に2番目の引数として' true'を渡すみましたライブラリ/ windows/desktop/aa378977(v = vs.85).aspx)? –

+0

が試行されました。それは同じ – xfr1end

答えて

0

でのリリースですか!タスクマネージャで数字を調べるだけですか? m_pRootStgオブジェクトは正しく動作しますか?

リークと呼ぶかどうかわかりませんが、ui.LowPartしか設定されていないので、他の部分がゼロでなく、大きなオフセットに書き込む危険があります。バッファの先頭に書き込む場合は、ui.QuadPart = 0を使用する必要があります。これがあなたの問題を引き起こしていない場合、あなたはただ幸運になり、StackはすでにHighPartメンバーがメモリにあるところに0を持っています。

もう1つの問題は、コードの先頭に古いオブジェクト(存在する場合)をm_pRootStg = NULL;で捨て去るため、LoadFileメソッドを複数回呼び出すことができないことです。あなたはLoadFileがを複数回呼び出している場合は、

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