Warum kann ich „delete p;“, aber nicht „delete (p + 1);“? Warum löschen Sie einen L-Wert erfordern?
-
27-09-2019 - |
Frage
diese Seite , es ist geschrieben, dass
Ein Grund dafür ist, dass der Operand löschen müssen, kein L-Wert sein. Bedenken Sie:
delete p+1;
delete f(x);
Hier ist die Implementierung der Lösch- nicht über ein Zeiger auf das es Null zuweisen kann.
eine Zahl in einem Zeiger verschiebt Hinzufügen von vorne im Speicher durch die viel Anzahl von sizeof(*p)
Einheiten.
Also, was ist der Unterschied zwischen delete p
und delete p+1
, und warum macht der Zeiger 0
nur ein Problem mit delete p+1
sein?
Lösung
Sie können nicht p + 1 = 0
tun. Aus dem gleichen Grunde, wenn Sie delete p + 1
dann nicht Null aus seinem Operanden löschen kann (p + 1), das ist, was die Frage auf Stroustrup FAQ geht.
Die Wahrscheinlichkeit, dass Sie würde jemals schreiben delete p+1
in einem Programm recht niedrig ist, aber das ist nebensächlich ...
Andere Tipps
p und p + 1 Punkt an verschiedenen Orten, wie Sie richtig auseinander sizeof(*p)
Einheiten sagten. Sie können nicht löschen etwas, das nicht zugewiesen wurde, sondern zum Beispiel:
A* p = new A();
p++;
delete p-1;
würde die ursprüngliche Zuordnung löschen. Löschen von p + 1, wenn p + 1 wurde ursprünglich nicht zugewiesen ist nicht definiert; glib Flips aus mit:
*** glibc detected *** free(): invalid pointer: 0x0804b009 ***
Die Umsetzung kann nicht Null p + 1, da p + 1 nicht eine Variable zu ändern. Der Absatz sagt, dass
delete p;
könnte übersetzt werden
free(p);
p = 0;
Das macht keinen Sinn, mit p + 1
Sie Eigentlich können delete
einen R-Wert. Nichts in der Spezifikation (n3242) tut es nicht aus. In der Praxis ist es gibt keinen Fehler .
BTW, wenn der Artikel sagt,
Operand löschen müssen, kein L-Wert
sein
es bedeutet, es kann oder auch nicht ein L-Wert sein. Es heißt nicht der Operand kann kein L-Wert sein.
Der Grund dafür ist, dass keiner von denen lvalues ??ist so sie auf NULL-Einstellung (oder einen anderen Wert) ist einfach nicht möglich.