Delphi – scurgere de memorie în TSevenZipVCL (Programare, Delphi, Scurgeri De Memorie, 7Zip)

hikari a intrebat.
a intrebat.

testarea scurgerilor de memorie cu madExcept de la madhi, și componenta TSevenZipVCL (http://www.rg-software.de) raportează o scurgere aici:

  POleStr = PWideChar;
  TBStr = POleStr;
    function TSevenZip.List: Integer;
    ...
      for i := 0 to w - 1 do
      begin
        name := new( TBSTR ); <-------
        ptype := 0;
        inA.GetPropertyInfo( i, name, prop, pType );

chiar dacă adaug Dispose(name) scurgerea apare, ce ar putea fi în neregulă?

Componenta TSevenZip a fost postată aici: http://pastebin.com/bhvERDJv

Comentarii

  • Trebuie să arătați mai multe detalii. Care este interfața și care este protocolul de apelare a funcției? Nu faceți acest lucru în orb? Trebuie să înțelegeți ce face codul. Aș ghici că apelul la New este fals. Dar nu pot fi sigur. –  > Por David Heffernan.
  • A postat unitatea completă la pastebin.com/bhvERDJv –  > Por hikari.
1 răspunsuri
David Heffernan
inA.GetPropertyInfo( i, name, prop, pType );

Se pare că acestei funcții i se trece un index în primul parametru, iar prin ceilalți parametri returnează informațiile pentru proprietatea cu acel index. Adresa IInArchive interfață a fost foarte prost tradusă de cel care a scris codul pe care îl apelați. Funcția arată în felul următor:

function GetPropertyInfo( index: DWORD; var name: TBSTR; var propID: PROPID; 
    var varType: {PVARTYPE}Integer ): Integer; stdcall;

Declarația C++ arată astfel:

STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType);

name este un COM BSTR care este alocat în funcție și returnat apelantului.

Eu l-aș declara în felul următor:

function GetPropertyInfo( index: DWORD; out name: WideString; var propID: PROPID; 
    var varType: {PVARTYPE}Integer ): Integer; stdcall;

În acest fel, vă veți asigura că compilatorul este capabil să dezalocalizeze COM BSTR atunci când ați terminat cu el.

Ar trebui să eliminați apelul către New. Este complet falsă.

Comentarii

  • Mulțumesc că funcționează. Acum a rămas doar scurgerea BTMemoryModule de la cealaltă întrebare pe care ați postat-o. –  > Por hikari.