[C++] ADO geeft memory leak ?

Pagina: 1
Acties:

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 21-06 17:02
Als ik deze code uitvoer, door op de Test button te klikken zie ik in de Task-manager de memory-usage bij elke klik stijgen.
Wat ben ik vergeten?
Ik weet het de code heeft (nog) geen enkel nut, dus gelieve daar geen opmerkingen over te geven.

RsAN is een klasse overgeërfd van CADORecordBinding te vinden in ICRSINT.H
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};

void CDabc::OnTest() 
{
  RsAN rsAN;

  _RecordsetPtr    pRstAn  = NULL;
  _ConnectionPtr pConnection    = NULL;

    // Define string variables.
  _bstr_t strCnn("Provider=sqloledb;Data Source=destptl;Initial Catalog=Test;User Id=john;Password=doe;");

  // Define Other Variables.
  HRESULT  hr = S_OK;
  IADORecordBinding   *picRs  = NULL;  // Interface Pointer declared.

  try {
     TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
     pConnection->Open(strCnn,"","",adConnectUnspecified);

     TESTHR(pRstAn.CreateInstance(__uuidof(Recordset)));
     pRstAn->Open("An", _variant_t((IDispatch *)pConnection,true), adOpenKeyset, adLockOptimistic, adCmdTable);

     // Open an IADORecordBinding interface pointer which we'll 
     // use for Binding Recordset to a class.
     TESTHR(pRstAn->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));

     //Bind the Recordset to a C++ Class here.
     TESTHR(picRs->BindToRecordset(&rsAN));

     // Clean up objects before exit.
     pRstAn->Close();
     pConnection->Close();

     pRstAn.Release();
     pConnection.Release();

  }
  catch(_com_error &e)
  {
    //
  } 
}

Verwijderd

code:
1
2
     pRstAn = NULL;
     pConnection = NULL;

Of is dat tegenwoordig obsolete? Weet het niet, is alweer een tijd geleden voor mij. :)

Verwijderd

Ik zie nergens een relase van je picRS :?

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Op vrijdag 07 juni 2002 12:06 schreef klokkie het volgende:
code:
1
2
     pRstAn = NULL;
     pConnection = NULL;

Of is dat tegenwoordig obsolete? Weet het niet, is alweer een tijd geleden voor mij. :)
Obsolete is 't zeker niet, al vermoed ik dat Release() er hier voor zou moeten zorgen, 't blijft netjes.

Ik kan de fout ook even niet vinden. Hoeveel geheugen verlies je? Heb je geen tool die kan checken waar je 't verliest?

  • The End
  • Registratie: Maart 2000
  • Laatst online: 21:34

The End

!Beginning

Op vrijdag 07 juni 2002 11:27 schreef Baron het volgende:
Als ik deze code uitvoer, door op de Test button te klikken zie ik in de Task-manager de memory-usage bij elke klik stijgen.
Wat ben ik vergeten?
Ik weet het de code heeft (nog) geen enkel nut, dus gelieve daar geen opmerkingen over te geven.

[knip]
Dat je het geheugen in de task-manager ziet stijgen zegt niks... (Als het niet met 10Mb tegelijk is) Het kan soms een hele tijd stijgen en dan wordt er opeens een heleboel vrijgemaakt. Wat zegt de debugger over memory leaks?

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 21-06 17:02
ik heb het gevonden.

picRs->Release();

moet er nog ergens tussen.

Waarom doet MS dit niet in hun voorbeelden :?

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Op vrijdag 07 juni 2002 12:11 schreef Yarvieh het volgende:
Ik zie nergens een relase van je picRS :?
Yarvieh heeft gelijk...

if (picRS) picRS->Release();

Check de MSDN-voorbeeldcode maar. (volgens mij komt dit daar rechtstreeks uit?)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthupdatexvc.asp
Pagina: 1