free -> Absturz
-
Hallo!
habe momentan häufig das Problem dass innerhalb einer Funktion die Funktion free() das Programm zum abstürzen bringt.
char * test = (char*) calloc(100,1); ... free(test);
Viel verkehrt kann man da ja wohl nicht machen oder irre ich mich da?
Kann mir jemand sagen woran das liegen kann und was man machen könnte?Vielen DAnk
Russal
P.S. haben noch vergessen zu sagen, verwende VC6
[ Dieser Beitrag wurde am 29.08.2002 um 16:12 Uhr von Russak editiert. ]
-
Warum nimmst nicht einfach new und delete?
Aso: Hast du vlt. vorher schonmal den Speicher freigegeben - oder ausversehen den Zeiger verändert?
[ Dieser Beitrag wurde am 29.08.2002 um 16:24 Uhr von Nemesyzz editiert. ]
-
Hi!
habe noch mal nachgeschaut steht nichts dabei was eigentlich stören könnte! Aber grundsätzlich was ist der Unterschied zw. new/delete und calloc/free?
Danke
Russak
-
Ich denkmal nix (Ausser das man Klassen damit anlegen kann)
Is halt nur Benutzerfreundlicher...char* test=new char[100];
...
delete[] char;Poste halt mal deinen Code
[ Dieser Beitrag wurde am 29.08.2002 um 16:30 Uhr von Nemesyzz editiert. ]
-
char * databuffertemp = (char*) calloc(databuffertemplen, 1); //char * databuffer = new char[databuffertemplen]; //fürs Kopieren aktuelle Position DWORD currentpos = 0; //Tinit reinschreiben falls aktiviert ist if (GetDlgItem(IDC_CHECK11)->SendMessage(BM_GETCHECK, 0, 0) == BST_CHECKED) { //EEPROM-Befehl memcpy(databuffertemp+currentpos, m_bildpcl, 7); databuffertemp[currentpos+2] = '@'; databuffertemp[currentpos+7] = HIBYTE(m_eeprom.tinitsize); databuffertemp[currentpos+8] = LOBYTE(m_eeprom.tinitsize); //TINIT memcpy(databuffertemp+9, m_eeprom.tinit, m_eeprom.tinitsize); //aktuelle Position aktualisieren currentpos += m_eeprom.tinitsize+9; } //T0-T9 reinschreiben falls aktiviert sind //da Tx alle zusammen gespeichert sind braucht man zus. Zeiger //um sich im Text bewegen zu können DWORD textpos = 4; for (i=IDC_CHECK1; i<=IDC_CHECK10; i++) { if (GetDlgItem(i)->SendMessage(BM_GETCHECK, 0, 0) == BST_CHECKED) { //EEPROM-Befehl memcpy(databuffertemp+currentpos, m_bildpcl, 7); databuffertemp[currentpos+2] = i-IDC_CHECK1+0x30; databuffertemp[currentpos+7] = HIBYTE(m_eeprom.textsize[i-IDC_CHECK1]); databuffertemp[currentpos+8] = LOBYTE(m_eeprom.textsize[i-IDC_CHECK1]); //Tx memcpy( databuffertemp+currentpos+9, m_eeprom.text+textpos, m_eeprom.textsize[i-IDC_CHECK1]); currentpos += m_eeprom.textsize[i-IDC_CHECK1]+9; textpos += m_eeprom.textsize[i-IDC_CHECK1]+4; } else textpos += 4; } //Das Bild selber memcpy( databuffertemp+currentpos, m_bildpcl, m_bildpclsize+9); currentpos += m_bildpclsize+9; //Bilddatenbuffer löschen wird später noch mal kopiert free(m_bildpcl); //enthält jetzt komplette Daten m_bildpcl = (char*) calloc(currentpos,1); memcpy(m_bildpcl, databuffertemp, currentpos);
hier ist das Problem
free(databuffertemp);
keine Ahnung...
-
und übrigens habe jetzt mit deinem Vorschlag gemacht schmiert genau so ab:(
Vorschläge?
-
Ich würde sagen du hast zuwenig Speicher mit calloc angefordert.
-
ich denke mir wenn ich zu wenig genommen habe und zufälliger weise über die Grenze geschrieben habe weiß ja eigentlich free() davon nicht, der muss ja nur den von der Variable beanspruchten Speicher freigeben oder ...
Russak
-
Doch!
Beispiel:
char* test=(char*)calloc(100,1); char a[101]; memcpy(test,a,101); MessageBox("..."); free(test);
Das Programm schmiert erst nach der MessageBox ab.
[ Dieser Beitrag wurde am 29.08.2002 um 16:55 Uhr von Nemesyzz editiert. ]
-
Tatsächlich!
werde dann mein Abschnitt genauer anschauen!vielen Dank!
Russak
-
Es ist auch nie verkert nach einem alloc oder new ers einmal zu überprüfen ob der Speicher überhaupt zur verfügung steht oder ob ein NULL Pointer zurückgegeben wurde. Sonst geht dem Programm irgend wann der Speicher aus ohne das das du das Merkst. Das fürt dan unweigerlich zum absturz.
Wenn Windows die Auslagerungsdatei vergrößert kann das dazu füren das das Programm kurz kleinen Speicher bekommt!
-
Acha!
Also ein paar mal habe ich das gehabt und nach dem Rebooten wasrs eigentlich wieder in Ordnung! Wie soll ich dann vorgehen? Kann ich eine bestimmte Zeit abwarten und dann noch mal den Speicherbereich anfordern oder soll ich komplett die laufende Funktion abrechen?
Danke
Russak?
-
Das Kommt auf dein Programm an. Allerdings kannst du sicher sein das dies dann wohl in nächsterzeit wieder vorkommt und dein Programm ziemlich langsam wird wenn du auf speicher wartest. Nach x Fehlversuchen würde ich auf jeden fall abbrechen. Aber wichtig ist das du auf NULL überprüfst sonst schreibst du einfach da weiter und dein Programm Stürtzt mit dem Ganzen Computer ab!
Bis jetzt habe ich dann immer die Function abgebrochen und einen Fehlercode zurückgegeben, damit die aufrufende Funktion ebenfals mitbekommt das erwas nicht Funktioniert hat.