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:

  1. aufrufen destructor
  2. 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?

War es hilfreich?

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.

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