Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Memory Leak, bitte helft mir

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.05.2007, 11:39 Uhr
jaydee



Habe in folgendem Code irgendwo ein Speicherleck und kann es nicht finden. Im Debugmodus ist noch alles okay doch wenn ich das Release erstelle meldet mir Deleaker Speicherlecks.

Hier der Code:

C++:
#include <string>

int CRCCheck();

int main()
{
   printf("Das Ergebnis ist: %i",CRCCheck());
} //main

int CRCCheck()
{
   char Line[] = "$GPGGA,090401,5349.506,N,01030.245,E,1,06,2.6,30.6,M,44.7,M,,*77";
   char Dollar[] = "$";
   char Star[] = "*";

   char *pdest;
   int  DollarPos;
   int  StarPos;
   int  CRC = 0;           //Calculated Checksum
   int  NMEACRC;           //Checksum from NMEA GPS Log
   char Checksum[4];

   pdest = strstr( Line, Dollar );
   if (pdest == NULL) return -2;          //Dollar sign not found
   DollarPos = (int)(pdest - Line + 1);
   if (DollarPos != 1) return -1;         //Dollar sign not the first character
   pdest = strstr( Line, Star );
   if (pdest == NULL) return -3;          //Star sign not found
   StarPos = (int)(pdest - Line + 1);
  
   Checksum[0] = 0x30;  //0
   Checksum[1] = 0x78;  //x
   Checksum[2] = Line[StarPos];
   Checksum[3] = Line[StarPos + 1];

   NMEACRC = strtol(Checksum,NULL,16);
  
   for (int i = 1; i <= StarPos - 2; i++)
   {
      CRC ^= Line[i];
   }

   if (CRC == NMEACRC) return 0;    //no failure
   if (CRC != NMEACRC) return -4;   //Checksum doesn't match

   return 7;      //other failure
} // CRCCheck



Vielen Dank für eure Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.05.2007, 11:55 Uhr
virtual
Sexiest Bit alive
(Operator)


Da du keinerlei Funktionen aufrufst, welche ein Memoryleak in der form verursachen, daß du ein free() o.ä. vergessen hast, kommen eigentlich nur drei Möglichkeiten in betracht:

1. Du schreibst irgendwelchen Mist in Speicherbereiche, die nicht Dir gehören. Auf den ersten Blick halte ich das aber für unwahrscheinlich.

2. Deine Laufzeitbibliotheken sind unsauber programmiert, was nicht selten ist (da werden häufig mal Buffer einmalig belegt und weils eben einmalig ist, macht man sich nicht die Mühe, es frei zu geben). Ein heisser Kandidat für so was ist printf im main - Lass es einfach mal weg und ruf nur CRCCheck auf

3. Auch nicht ganz unwahrscheinlich ist die Möglichkeit, daß dein MemoryDebugger sich irrt. Wie heißt er denn?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.05.2007, 13:05 Uhr
Tommix



Hallo,
es hat zwar mit der Frage nichts zu tun, aber bei Checksum fehlt, wenn ich's nicht übersehen habe, das abschließende '\0' und Du verläßt Dich darauf, daß nach dem * noch zwei Zeichen kommen.

@Virtual:
"... meldet mir Deleaker Speicherlecks ..."

Gruß, Tommix

Dieser Post wurde am 24.05.2007 um 13:05 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.05.2007, 16:45 Uhr
jaydee



Danke für die schnelle Antwort.

@virtual
Es wird wohl 2. sein. habe mir mal alle Ergebnisse von Deleaker angeschaut und habe dort einige der Laufzeitbibliotheken gefunden.

Gruß jaydee
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.05.2007, 17:55 Uhr
BoBtheREapER
kein job für nen BoB



C++:
char *pdest;


entweder ich habs einfach nur übersehen oder du deletest pdest nicht.
--
"Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher." - Albert Einstein
www.blue-xenon.de.vu
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.05.2007, 18:16 Uhr
0xdeadbeef
Gott
(Operator)


Das ist ja auch garnicht nötig, weil pdest auf dem Stack liegt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.05.2007, 20:16 Uhr
xXx
Devil


hmm ... ist nicht wirklich besser und basiert auf deinem Code aber:

C++:
unsigned short checksum_check(const char* sum)
{
    char* temp = strchr(sum, '$');
  
    if (temp == NULL)
        return 1;

    if ((int)(temp - sum + 1) != 1)
        return 2;
  
    temp = strchr(sum, '*');

    if (temp == NULL)
       return 3;
  
    unsigned int pos = (unsigned int)(temp - sum + 1);
    if (strlen(sum) < (pos + 1))
        return 4;
  
    char chksm_arr[5] = {0x30, 0x78, sum[pos], sum[pos + 1], 0 };
    long chksm = strtol(chksm_arr, NULL, 16);
      long calc_chksm = 0;
    for (unsigned int i = 1; i < pos - 1; ++i)
        calc_chksm ^= sum[i];

    return (calc_chksm == chksm ? 0 : 5);
}
... kann auch sein, dass das eventuell in C so nicht geht ... dann ignoriere diesen Post bitte Hmm mir fällt gerade auf, das ich es nicht kompiliert hab um zu sehen ob ich einen Fehler drin habe :/ Sollte jetzt aber alle gesehen haben

Dieser Post wurde am 24.05.2007 um 20:19 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.05.2007, 21:14 Uhr
Bruder Leif
dances with systems
(Operator)


Es lebe valgrind. Schau Dir mal den Puffer "Checksum" an, ueberleg mal, wo das 0x00 am Ende des Strings steht, und aendere das. Die Fehler in der Lib kommen von einem nicht terminierten C-String. Siehe Tommix' Post...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.05.2007, 14:35 Uhr
xXx
Devil


hmm sollte in meiner "Lösung" terminiert sein

C++:
char chksm_arr[5] = {0x30, 0x78, sum[pos], sum[pos + 1], 0 };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: