
Liebling
int *p=(int * )malloc(sizeof(int));
delete p;
Wenn wir Speicher mit malloc zuweisen, sollten wir ihn mit free freigeben, und wenn wir mit new in C++ zuweisen, sollten wir ihn mit delete freigeben.
Aber wenn wir Speicher mit malloc zuweisen und dann delete verwenden, sollte es einen Fehler geben. Aber im obigen Code gibt es keinen Fehler oder keine Warnung in C++.
Auch wenn wir umkehren und mit new zuweisen und mit free freigeben, gibt es auch keinen Fehler oder keine Warnung.
Wieso ist es so?
Dies ist ein undefiniertes Verhalten, da es keine Möglichkeit gibt, zuverlässig zu beweisen, dass der Speicher hinter dem Zeiger korrekt zugewiesen wurde (dh durch new
zum delete
oder new[]
zum delete[]
). Es ist Ihre Aufgabe, dafür zu sorgen, dass so etwas nicht passiert. Es ist einfach, wenn Sie die richtigen Werkzeuge verwenden, nämlich intelligente Zeiger. Wann immer du sagst delete
Du machst es falsch.
dann sollte da ein fehler sein
Es gibt. Es ist nur nicht unbedingt ersichtlich.
Der C++-Standard (und der C-Standard, der dem C++-Standard nachempfunden ist) nennt diese Art von Fehler undefiniertes Verhalten. Von nicht definiert sie bedeuten, dass überhaupt alles passieren kann. Das Programm kann normal fortgesetzt werden, es kann sofort abstürzen, es kann eine wohldefinierte Fehlermeldung erzeugen und ordnungsgemäß beendet werden, es kann einige Zeit nach dem eigentlichen undefinierten Verhaltensereignis anfangen, zufällige Fehler zu zeigen, oder nasale Dämonen beschwören.
Es liegt in Ihrer Verantwortung, diese Fehler zu beobachten und zu beseitigen. Nichts wird Sie garantiert benachrichtigen, wenn sie passieren.

andre
Benutzen free()
nicht delete
.
wenn du malloc
dann musst du anrufen free
Speicher freizugeben.
wenn du new
du musst anrufen delete
Speicher freizugeben.
Hier ist ein Link, der es erklärt.
10130600cookie-checkVerhalten von malloc mit delete in C++yes
Denken Sie auch an Konstruktoren und Destruktoren.
– Jaywalker
1. Juni 2012 um 16:39 Uhr
Es gibt vielleicht keine Warnung, aber es ist definitiv ein Fehler. (So oder so)
– CB Bailey
1. Juni 2012 um 16:40 Uhr
“da sollte ein fehler vorliegen” – sagt wer? Das Verhalten ist undefiniert und der C++-Standard gibt keinen Kommentar dazu ab, was passieren soll. Wenn Sie einen Fehler wollen, müssen Sie möglicherweise ein anderes Tool verwenden, z Valgrind.
– Robᵩ
1. Juni 2012 um 16:41 Uhr