Der Aufruf von delete auf den Variablen auf dem Stapel reserviert
Ignorieren Programmierung Stil und design, ist es "sicher" zu nennen, delete auf eine variable auf dem Stapel reserviert?
Beispiel:
int nAmount;
delete &nAmount;
oder
class sample
{
public:
sample();
~sample() { delete &nAmount;}
int nAmount;
}
Warum würden Sie wollen?
Verwandte: stackoverflow.com/questions/434140/...
In etwa so sicher ist wie stochern einen scharfen Nadel in Ihrem Auge.
Nasen-Dämonen - dies ist, was passiert
Ein Kätzchen getötet wird, irgendwo.
Verwandte: stackoverflow.com/questions/434140/...
In etwa so sicher ist wie stochern einen scharfen Nadel in Ihrem Auge.
Nasen-Dämonen - dies ist, was passiert
Ein Kätzchen getötet wird, irgendwo.
InformationsquelleAutor unistudent | 2009-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Keine, es ist nicht sicher, rufen Sie
delete
auf eine stack-variable zugewiesen. Sie sollten nur anrufendelete
auf Dinge, die erstellt vonnew
.malloc
odercalloc
, es sollte genau einenfree
.new
es sollte genau einendelete
.new[]
es sollte genau einendelete[]
.Im Allgemeinen, Sie können mix and match diese z.B. keine
free
-ing oderdelete[]
-ing einenew
Objekt. Dies führt zu undefiniertem Verhalten.In Ihren Bearbeitungen, können wir ersetzen jedes "sollen" mit "müssen".
"Sollte" ist ein besseres Wort. "Müssen" impliziert, dass ein malloc/new/new[] wird scheitern, wenn die free/delete/delete[] nicht vorhanden ist, was nicht der Fall ist. Die Verwendung von "genau eins" trägt die Implikation, die ich denke, Sie werden für.
Vielen Dank, Sie sind richtig. Behoben.
InformationsquelleAutor Mr Fooz
Gut, versuchen wir es:
Also anscheinend ist es überhaupt nicht sicher.
Dies ist ein irrelveant Bemerkung. Sie versuchen etwas und finden, dass es unsicher ist nicht beweisen, dass es unsicher ist. Dies ist, was die Antwort ist. Wenn der Beantworter nicht hatte, fand sein Beispiel, segfault, er hätte einfach nicht gepostet. Sie weiß nicht, wie viele Dinge, die er versucht, vor erreichen, dass Beispiel.
Ich glaube nicht, dass Sie bekam cdhowies Punkt. Es gibt viele Dinge in C++, die nicht sicher, aber kann zu arbeiten. Ich bin sicher, Sie finden einen compiler produziert code, der nicht segmentation Fault, weil Sie dachte, es wäre ein großartiges feature. Alles funktioniert einfach toll. Wechseln Sie nun compiler und beachten Sie, dass, nur weil Sie nicht erhalten eine Fehlermeldung, die mit der vorherigen compiler bedeutet nicht, dass Ihr code ist nicht schlecht und unfähig zu arbeiten, mit anderen compiler. Informatik ist komplexer, als es 'klappte Es dieses mal, so muss es vollkommen in Ordnung ist.' Auch nicht zu erwähnen, das Konzept der "Undefiniertes Verhalten"
Ich glaube, du verpasst meine Punkt @itzJanuary
Um fair zu sein, ich glaube, ich habe.
InformationsquelleAutor Jeremy Ruten
Beachten Sie, dass beim reservieren eines Speicherblocks mit neuen (oder malloc für diese Angelegenheit), die tatsächliche blockieren des Arbeitsspeichers größer sein wird als das, was Sie gefragt haben.
Der Speicherblock enthält auch einige historische Angaben, so dass, wenn Sie sich frei den block, kann es leicht sein, wieder in den freien pool und vielleicht sein verschmolzen mit den angrenzenden frei-Blöcke.
Wenn Sie versuchen, um Speicher frei, dass Sie didn ' T erhalten neue, dass die Buchführung Informationen nicht da sein, aber das system wird handeln, wie es ist, und die Ergebnisse werden unberechenbar (in der Regel schlecht).
InformationsquelleAutor Ferruccio
Ja, es ist Undefiniertes Verhalten: vorbei an
delete
alles, was nicht vonnew
ist UB:Den Folgen des undefinierten Verhalten sind, naja, nicht definiert. "Nichts passiert" ist genauso gültig, eine Folge, als alles andere. Es ist jedoch in der Regel "nichts geschieht sofort": die Freilassung eines ungültigen Speicherblock kann schwerwiegende Folgen haben, die in nachfolgenden aufrufen der Zuweisung.
InformationsquelleAutor dasblinkenlight
Nach dem spielen ein bisschen mit g++ 4.4 in windows, bekam ich sehr interessante Ergebnisse:
Aufruf von delete auf eine stack-variable scheint nicht, etwas zu tun. Keine Fehler werfen, aber ich kann auf die variable ohne Probleme nach dem löschen.
Dass eine Klasse mit einer Methode mit
delete this
erfolgreich löscht das Objekt, wenn es zugeordnet ist, in den Haufen, aber nicht, wenn es zugeordnet ist, in dem Stapel (wenn es in dem stack, passiert nichts).1. ist wahrscheinlich nicht definiertes Verhalten..
InformationsquelleAutor Sambatyon
Niemand kann wissen, was passiert. Dies ruft nicht definiertes Verhalten, also buchstäblich alles passieren kann. Dies nicht tun.
Nein, es ist nicht möglich, dass die Informationen nur einem Zeiger. Könnten Sie
std::shared_ptr
mit einer custom deleter, die nichts tut, um nicht-dynamische Objekte, oder Ihre eigenen Metadaten hinzufügen, oder kommen mit einer weniger gewundenen lifetime-management-Strategie.Normalerweise gehe ich durch eine einfache Regel: das Objekt oder Den Bereich, ist verantwortlich für die Objekt-Erstellung ist auch verantwortlich für seine Löschung. Oder anders: nicht
delete
ein Objekt, das Sie noch nichtnew
ed in den ersten Platz.wenn Sie dies benötigen, Ihr design ist ernsthaft fehlerhaft. Überdenken Sie, sollte dies kein problem sein.
Wo hast du die QObject-Zeug aus? In der Qt-API-docs, bei QObject::~QObject(), es sagt ganz klar: Warnung: Alle untergeordneten Objekte gelöscht. Wenn eines dieser Objekte auf dem stack oder global, früher oder später wird Ihr Programm Abstürzen.
InformationsquelleAutor
Nein,
Speicher mit new gelöscht werden sollen, mithilfe von delete-operator
und, die zugeordnet mit malloc sollten gelöscht werden frei.
Und keine Notwendigkeit zum freigeben der variable, die zugeordnet sind, auf Stapel.
InformationsquelleAutor Vinay
Ein Engel verliert seine Flügel... man kann Sie nur anrufen
delete
auf einem Zeiger zugewiesen mitnew
, ansonsten bekommst du Undefiniertes Verhalten.InformationsquelleAutor Luchian Grigore
hier der Arbeitsspeicher ist mit stack, so dass keine Notwendigkeit, es zu löschen exernally aber wenn Sie allcoted dynamisch
wie
int *a=new int()
dann muss man löschen und nicht löschen &a(a selbst ist ein Zeiger), weil der Arbeitsspeicher ist von free-Shop.
InformationsquelleAutor
Du die Frage bereits beantwortet sich selbst.
delete
darf nur verwendet werden für Zeiger eingeholt durchnew
. Etwas anderes zu tun, ist schlicht und einfach ein Undefiniertes Verhalten.Daher ist es wirklich nicht sagen, was passiert, etwas von der code funktioniert Prima durch Absturz zu löschen Ihrer Festplatte ist ein gültiges Ergebnis, dies zu tun. Also bitte dies nie tun.
InformationsquelleAutor Grizzly
Es ist UB, da müssen Sie nicht rufen Sie löschen auf ein Element, das nicht dynamisch zugewiesen, mit neuen. So einfach ist das.
InformationsquelleAutor Martin James