Ich habe eine grundlegende Frage zu den const-Zeigern. Ich darf keine Nicht-Const-Member-Funktionen mit einem Const-Zeiger aufrufen. Ich darf dies jedoch mit einem const-Zeiger tun:
delete p;
Dies ruft den Destruktor der Klasse auf, der im Wesentlichen eine nicht konstante 'Methode' ist. Warum ist das erlaubt? Ist es nur um dies zu unterstützen:
delete this;
Oder gibt es einen anderen Grund?
c++
const
delete-operator
Naveen
quelle
quelle
const Foo * f
oderFoo const * f
ist kein konstanter Zeiger auf Foo. Es ist ein Zeiger auf const Foo.Foo * const f
ist ein konstanter Zeiger auf Foo.Sagen wir es so - wenn es nicht erlaubt wäre, gäbe es keine Möglichkeit, const-Objekte zu löschen, ohne const_cast zu verwenden.
Semantisch ist const ein Hinweis darauf, dass ein Objekt unveränderlich sein sollte. Dies bedeutet jedoch nicht, dass das Objekt nicht gelöscht werden sollte.
quelle
Konstruktoren und Destruktoren sollten nicht als 'Methoden' angesehen werden. Sie sind spezielle Konstrukte zum Initialisieren und Abreißen eines Objekts einer Klasse.
'const pointer' gibt an, dass der Status des Objekts nicht geändert wird, wenn Operationen an ihm ausgeführt werden, während es lebt.
quelle
Ja, das bist Du.
Sie haben einen const-Zeiger auf ein nicht-const-Objekt mit einem non-const-Zeiger auf ein const-Objekt verwechselt.
Trotzdem
Es ist legal, beide zu löschen, aus den Gründen, die bereits in den anderen Antworten hier angegeben sind.
quelle
Eine andere Sichtweise: Die genaue Bedeutung eines const-Zeigers besteht darin, dass Sie keine Änderungen an dem Objekt vornehmen können, auf das verwiesen wird, das über diesen oder einen anderen Zeiger oder Verweis auf dasselbe Objekt sichtbar wäre. Wenn ein Objekt zerstört wird, sind alle anderen Zeiger auf die Adresse, die zuvor vom jetzt gelöschten Objekt belegt wurde, keine Zeiger mehr auf dieses Objekt . Sie speichern dieselbe Adresse, aber diese Adresse ist nicht mehr die Adresse eines Objekts (tatsächlich kann sie bald als Adresse eines anderen Objekts wiederverwendet werden).
Diese Unterscheidung wäre offensichtlicher, wenn sich Zeiger in C ++ wie schwache Referenzen verhalten würden, dh sobald das Objekt zerstört wird, würden alle vorhandenen Zeiger darauf sofort auf gesetzt
0
. (Dies wird zur Laufzeit als zu kostspielig angesehen, um es allen C ++ - Programmen aufzuerlegen, und tatsächlich ist es unmöglich, es vollständig zuverlässig zu machen.)UPDATE : Neun Jahre später ist es anwaltlich. Ich finde jetzt Ihre ursprüngliche Reaktion verständlich. Mutation zu verbieten, aber Zerstörung zuzulassen, ist eindeutig problematisch. Der implizite Vertrag von const-Zeigern / Referenzen besteht darin, dass ihre Existenz als Block bei der Zerstörung des Zielobjekts fungiert, auch bekannt als automatische Speicherbereinigung.
Die übliche Lösung besteht darin, stattdessen fast jede andere Sprache zu verwenden.
quelle
std::unique_ptr<const T>
Ende des Lebens um?