delete, delete[], free
-
Hallo,
ich habe mir mal ein kleines Testprogramm geschrieben, um festzustellen, ob delete, delete[] und free irgend einen Unterschied machen im Hinblick darauf, ob der Speicher wieder freigegeben wird.
void ShowMem() { printf("%d\r\n",System::GetHeapStatus().TotalAllocated-start); } int main(int argc, char* argv[]) { start = System::GetHeapStatus().TotalAllocated; ShowMem(); // 0 ShowMem(); // 400 ShowMem(); // 400 char *s1 = new char; ShowMem(); // 408 char *s2 = new char; ShowMem(); // 416 char *s3 = new char[30]; ShowMem(); // 448 //free( s3); //delete s3; delete []s3; ShowMem(); // 416 getch(); return 0; }
Eine Konsolenanwendung ("dynamische RTL verwenden" deaktiviert) liefert für die Freigabe von s3 keinen Unterschied.
Die Frage wäre jetzt, ist dem wirklich so, oder messe ich mitSystem::GetHeapStatus().TotalAllocated;
falsch?
Das nächste, warum wird für für einen neuen char-Pointer + char-"Zelle" gleich 8 Byte verwendet?
Wohingegen für das 30er char-Array dann 32 Byte verwendet werden. Da hätte ich dann eher 34 oder 38 Byte erwartet. Und ja, der Speicher von s1 und s2 wird nicht freigegeben.
Gruß
Markus
-
Ich weiß zwar nicht, welche Auswirkungen es hat, mit new reservierten Speicher mittels free freizugeben, aber in allen Büchern steht, man soll es nicht machen... Wird wohl seinen Grund haben.
Der Unterschied zwischen delete und delete[] auf ein Array ist, dass bei delete nur das erste Objekt im Array freigegeben wird, bei delete[] alle Objekte im Array freigegeben werden.
-
Ich weiß zwar nicht, welche Auswirkungen es hat, mit new reservierten Speicher mittels free freizugeben
Solange es um PODs geht wird es wohl kaum einen Unterschied machen. Bei free wird eben, im Gegensatz zu delete, kein Destruktor aufgerufen.
-
Braunstein schrieb:
Solange es um PODs geht wird es wohl kaum einen Unterschied machen.
Darauf würde ich mich nicht verlassen. Nur daß es meistens funktioniert, garantiert nicht, daß irgendeine unerwartete Situation (ein subtiler Unterschied im Allokationsverhalten von new und malloc, eine Änderung der Implementation beim Update auf eine neuere Version, ...) plötzlich alles kaputtmacht.
-
Ich habe auch nicht gesagt, dass man sich darauf verlassen soll.
Vielleicht ist meine Aussage nicht exakt genug gewesen. Deswegen nochmal zum Protokoll.
Gib niemals Speicher den du mit new geholt hast mit free wieder frei.
-
Braunstein schrieb:
Ich habe auch nicht gesagt, dass man sich darauf verlassen soll.
Ich habe auch nicht gesagt, daß du gesagt hättest... ach, du weißt schon
Ich wollt's nur klarstellen, damit bei Lesern des Threads nicht die Idee aufkommt, das wäre irgendwie okay.
-
Ich glaube wir sind uns jetzt einig.