2016-12-01 4 views
0

Ich habe folgenden Code, um OLE-Speicher aus dem Puffer zu öffnen. Aber es scheint Speicherverlust zu verursachen. Es verbraucht viel Speicher beim Ausführen.
Ich weiß nicht, wo es undicht ist.C++ Speicherverlust in StgStorage API

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 ist Freisetzung in destructor

+0

Haben Sie versucht, vorbei 'true' als zweites Argument auf [' CreateILockBytesOnHGlobal'] (https://msdn.microsoft.com/en-us/ Bibliothek/Windows/Desktop/aa378977 (v = vs.85) .aspx)? –

+0

versucht. es ist das gleiche – xfr1end

Antwort

0

Wie messen Sie das Leck? Schauen Sie sich nur die Zahlen im Task-Manager an. Funktioniert das m_pRootStg Objekt korrekt?

Ich weiß nicht, ob ich es ein Leck nennen würde, aber da Sie nur ui.LowPart setzen, könnte der andere Teil nicht Null sein und Sie könnten riskieren, zu einem großen Offset zu schreiben. Sie sollten ui.QuadPart = 0 verwenden, wenn Sie an den Anfang des Puffers schreiben möchten. Wenn Ihnen das keine Probleme bereitet, haben Sie nur Glück und der Stack hat bereits eine 0, in der sich das HighPart-Mitglied befindet.

Ein weiteres Problem ist, dass Sie die LoadFile-Methode nicht mehr als einmal aufrufen können, weil Sie das alte Objekt (falls vorhanden) mit m_pRootStg = NULL; am Anfang Ihres Codes wegwerfen. Wenn Sie Loadfile mehrmals anrufen, sollten Sie es auf

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