Warum kann ich „delete p;“, aber nicht „delete (p + 1);“? Warum löschen Sie einen L-Wert erfordern?

StackOverflow https://stackoverflow.com/questions/2656970

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top