2016-12-01 60 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; 
}