2016-12-01 5 views
0

У меня есть следующий код для открытия OLE Storage из буфера. Но это, по-видимому, вызывает утечку памяти. При работе он потребляет много памяти.
Я не знаю, где это происходит.утечка памяти C++ в API StgStorage

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, если хотите записать в начало буфера. Если это не вызывает у вас проблем, вам просто повезло, и в стеке уже есть 0, где элемент HighPart находится в памяти.

Другая проблема заключается в том, что вы не можете вызвать метод LoadFile более одного раза, поскольку вы просто удаляете старый объект (если есть) с m_pRootStg = NULL; в начале вашего кода. Если вы звоните LoadFile несколько раз, вы должны изменить его на

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