Was passiert bei delete[] ?
-
Wieso diese komische Frage?
Folgendes:
void blub() { float matrix[16]; foo(matrix); } void foo(float* matrix) { float* dummi = new float[16]; //tuheirgendwas delete[] matrix; matrix = dummi; }Der Kompiler meckert nicht. Das Programm läuft. Doch wenn ich mit dem Debugger (GDB) durchlaufe, hängt der sich an der delete[] stelle auf. Vermutlich, weil ich speicher freigebe, der nicht mit new allociert wurde.
Aber wieso läuft dann das Programm?
-
Undefiniertes Verhalten ist halt undefiniert. Da ist alles vom einbahnfreien Laufen des Programs bis zur Explosion des Rechner möglich.
-
Anfänger06 schrieb:
Aber wieso läuft dann das Programm?
Wie soll der Compiler feststellen können, ob der Zeiger matrix, der in Foo reingegeben wird, mit new allokiert wurde oder vielleicht auf ein statisches Array zeigt? Innerhalb einer Übersetzungseinheit wäre das ja rein theoretisch im Rahmen des Machbaren, hier eine Warnmeldung auszugeben. Spätestens wenn die Aufrufe aus verschiedenen UEs kommen, ist es dem Compiler absolut unmöglich, hier undefiniertes Verhalten festzustellen. Die Verantwortung für den Speicher liegt nunmal bei dir.
