
Unistudent
Ist es, abgesehen von Programmierstil und Design, “sicher”, delete für eine auf dem Stack zugewiesene Variable aufzurufen?
Zum Beispiel:
int nAmount;
delete &nAmount;
oder
class sample
{
public:
sample();
~sample() { delete &nAmount;}
int nAmount;
}

Herr Fuoz
Neines ist nicht sicher anzurufen delete
auf einer Stack-zugewiesenen Variablen. Sie sollten nur anrufen delete
auf Dinge, die von erstellt wurden new
.
- Für jeden
malloc
oder calloc
es sollte genau eine geben free
.
- Für jeden
new
es sollte genau eine geben delete
.
- Für jeden
new[]
es sollte genau eine geben delete[]
.
- Für jede Stapelzuweisung sollte es keine explizite Freigabe oder Löschung geben. Der Destruktor wird ggf. automatisch aufgerufen.
Im Allgemeinen können Sie keines davon mischen und anpassen, z. B. nein free
-ing oder delete[]
-ing ein new
Objekt. Dies führt zu undefiniertem Verhalten.
Nun, versuchen wir es:
jeremy@jeremy-desktop:~$ echo 'main() { int a; delete &a; }' > test.cpp
jeremy@jeremy-desktop:~$ g++ -o test test.cpp
jeremy@jeremy-desktop:~$ ./test
Segmentation fault
Es ist also anscheinend überhaupt nicht sicher.
Denken Sie daran, dass, wenn Sie einen Speicherblock mit new (oder malloc für diese Angelegenheit) zuweisen, der tatsächlich zugewiesene Speicherblock größer ist als das, was Sie angefordert haben. Der Speicherblock wird auch einige Buchhaltungsinformationen enthalten, so dass, wenn Sie den Block freigeben, er leicht zurück in den freien Pool gestellt und möglicherweise mit benachbarten freien Blöcken verschmolzen werden kann.
Wenn Sie versuchen, Speicher freizugeben, den Sie nicht von new erhalten haben, sind diese Buchhaltungsinformationen nicht vorhanden, aber das System verhält sich so, wie es ist, und die Ergebnisse werden unvorhersehbar (normalerweise schlecht) sein.

Sergej Kalinitschenko
Ja, es ist ein undefiniertes Verhalten: Passing to delete
alles, was nicht kam new
ist UB:
C++-Standard, Abschnitt 3.7.3.2.3: Der Wert des ersten Arguments, das einer der in der Standardbibliothek bereitgestellten Freigabefunktionen zugeführt wird, kann a sein null
Zeigerwert; Wenn dies der Fall ist und die Freigabefunktion in der Standardbibliothek bereitgestellt wird, hat der Aufruf der Freigabefunktion keine Wirkung. Andernfalls wird der Wert geliefert operator delete(void*)
in der Standardbibliothek muss einer der Werte sein, die von einem vorherigen Aufruf von entweder zurückgegeben werden operator new(std::size_t)
oder operator new(std::size_t, const std::nothrow_t&)
in der Standardbibliothek.
Die Folgen von undefiniertem Verhalten sind, nun ja, undefiniert. „Nichts passiert“ ist eine ebenso gültige Konsequenz wie alles andere. Normalerweise passiert jedoch “sofort nichts”: Das Freigeben eines ungültigen Speicherblocks kann schwerwiegende Folgen bei nachfolgenden Aufrufen des Zuordners haben.
Nachdem ich ein bisschen mit g++ 4.4 in Windows gespielt hatte, bekam ich sehr interessante Ergebnisse:
-
Der Aufruf von delete für eine Stack-Variable scheint nichts zu bewirken. Keine Fehler werfen, aber ich kann nach dem Löschen problemlos auf die Variable zugreifen.
-
Eine Klasse mit einer Methode mit haben delete this
löscht das Objekt erfolgreich, wenn es im Heap allokiert ist, aber nicht, wenn es im Stack allokiert ist (wenn es im Stack ist, passiert nichts).
Niemand kann wissen, was passiert. Dies ruft undefiniertes Verhalten hervor, sodass buchstäblich alles passieren kann. Tu das nicht.

Wein
Nein, Speicher, der mit new zugewiesen wurde, sollte mit dem delete-Operator gelöscht werden, und der mit malloc zugewiesene sollte mit free gelöscht werden. Und es ist nicht erforderlich, die Variablen, die auf dem Stapel zugewiesen sind, freizugeben.
9891000cookie-checkAufrufen von delete für eine auf dem Stack zugewiesene Variableyes
Siehe auch: stackoverflow.com/questions/434140/…
– jdt141
14. Januar 2009 um 3:57 Uhr
Beachten Sie, dass Ihr zweites Beispiel nicht auf dem Stapel sein muss. nAmount wäre lokal für das Speicherbeispiel, in dem es vorhanden ist.
– Drew Dormann
14. Januar 2009 um 4:33 Uhr
Ungefähr so sicher, als würde man sich eine spitze Nadel ins Auge stechen.
– paxdiablo
14. Januar 2009 um 5:46 Uhr
nasale Dämonen – das ist, was passiert
– BЈовић
20. September 2012 um 13:17 Uhr
Ein Kätzchen wird irgendwo getötet.
– Tadeusz Kopec für die Ukraine
20. September 2012 um 13:18 Uhr