Avatar billede comfortably_numb Nybegynder
25. januar 2007 - 10:23 Der er 1 kommentar

simpel ODBC kode fra C++ memoryleaker ?

Hej,

Har et problem på XP og 2003, har ikke arbejdet med ODBC før, men tænkte at min opgave var simpel, jeg har installeret en Firebird database, installeret ODBC driveren til denne, oprettet tabeller etc. og så vil jeg fra et lille C++ program kunne indsætte data i denne database.

Det gik egentlig også fint nok, men så satte jeg det under stress og lagde mærke til at det leakede helt vildt.

Jeg har så søgt med lys og lygte på nettet, og faldt over denne her fra Microsoft, hvor de beskriver problemet ret rammende for det jeg oplever (bruger dog ikke Oracle):


http://207.46.248.248/kb/232351

Jeg prøvede at tage deres kode, og køre den i loops, og problemet er præcis detsamme, applikationen banker bare memory opad og NP pool, så det leaker voldsomt.

Nedenstående er programmet, og jeg har linket ODBC dll'en til projektet og funktionalitetsmæssigt fungerer det (jeg rammer databasen og kan skrive/læse i den), men den leaker.

Som sagt, kører XP med alle updates, MDAC 2.8.1 SP, firebird 2.0 den seneste ODBC driver til firebird, etc. etc. etc.

Er der nogen der kan hjælpe mig her ? håber det virkelig.

Below - kodesnippet:

  #include        <windows.h>
  #include        <stdio.h>
  #include        <sql.h>
  #include        <sqlext.h>
  #include        <assert.h>

  #define CK_RT(x) if( x != SQL_SUCCESS && x != SQL_SUCCESS_WITH_INFO)    assert(0)

  void main(){
      HENV        henv;
      HDBC        hdbc;
      RETCODE    rc = SQL_SUCCESS;
      char        *dsnStr="DSN=FireBirdTest;UID=sysdba;pwd=masterkey;";
      short      rtnLen = 0;
      UCHAR      rtnDSN[999] = "";
      int        i,x;


      for (i=0; i < 100; i++)
      {
              rc = SQLAllocEnv(&henv);
              rc = SQLAllocConnect(henv, &hdbc);
              rc = SQLDriverConnect(hdbc,
                        NULL,
                        (unsigned char *)dsnStr,
                        strlen(dsnStr),
                        rtnDSN,
                        255,
                        &rtnLen,
                        SQL_DRIVER_NOPROMPT);

              SQLDisconnect(hdbc);
              SQLFreeConnect(hdbc);
              SQLFreeEnv(henv);
      }
  }
Avatar billede jhe-ting Nybegynder
07. februar 2007 - 13:21 #1
Funktionen SQLAllocEnv() er 'Depreciated'

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcsqlallocenv.asp

Hvilken version af ODBC har du?
Er det 3.0 eller bedre så se

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcsqlconnect.asp?frame=true

Der er et godt eksempel du kan bruge.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester