Wie funktioniert Deal mit Zeiger Konstantheit löschen?
-
09-09-2019 - |
Frage
Ich lese diese Frage einen const Zeiger Löschen und wollte mehr über delete
Verhalten wissen . Jetzt, nach meinem Verständnis:
delete expression
arbeitet in zwei Schritten:
- aufrufen destructor
- dann den Speicher (oft mit einem Aufruf an
free()
) durch den Aufruf Betreiber löschen.
operator delete
akzeptiert eine void*
. Im Rahmen eines Testprogramms I operator delete
überlastet und festgestellt, dass operator delete
nicht const
Zeiger akzeptiert.
Da Operator nicht gelöscht const Zeiger akzeptieren und löschen ruft intern Operator löschen, wie funktioniert Löschen ein const Zeiger arbeiten?
Ist delete
verwendet const_cast intern?
Lösung
const_cast hat nicht wirklich etwas zu tun - es ist ein Weg, Compiler zu unterdrücken, stöhnen über const-ness des Objekts. löschen Schlüsselwort ist ein Compiler-Konstrukt, weiß der Compiler, was in diesem Fall zu tun und kümmert sich nicht um const-ness des Zeigers.
Andere Tipps
Wie diese Antwort sagt, delete
kein Verfahren wie jedes andere ist , sondern ein Teil der langage Objekte zu zerstören. const
-ness hat keinen Einfluss auf destructability.
Operator löschen akzeptiert einen void *. Im Rahmen eines Testprogramms ich überladenen Operator löschen und gefunden löschen, dass Betreiber nicht const Zeiger akzeptiert.
Wie haben Sie versucht das? Es sicherlich hat akzeptieren const Zeiger:
#include <memory>
int main() {
void* const px = 0;
delete px;
::operator delete(px);
}
Dieser Code korrekt ist, kompiliert (wenn auch mit einer berechtigten Warnung) und führt.
Bearbeiten : der Original-Artikel Reading - Sie sprechen nicht über einen const Zeiger aber ein Zeiger auf const
, das ist etwas anderes. Der Grund, warum dies funktioniert hat, wird dort beschrieben. Was, warum es funktioniert: andere dies gesagt haben,
delete
ist ein Operator, der Sie überlasten. Es nimmt einen Zeiger als Argument und gibt den Speicher, möglicherweise free
verwenden. Der Compiler ermöglicht dies, ob der Zeiger const
ist oder nicht.
delete
macht gerade einen Anruf der Speicher den Zeiger auf ausplanen zu, es nicht den Wert des Zeigers ändern noch das Objekt. Daher delete
hat nichts mit der const
-ness des Zeigers oder Objekts zu tun, wies auf.