Frage

ich mich immer gefragt, warum die automatische Einstellung des Zeigers auf NULL nach löscht nicht Teil des Standard ist. Wenn diese Pflege würden viele der Abstürze aufgrund eines ungültigen Zeiger genommen wird von dann nicht auftreten. Aber gesagt hat, dass ich aus mehreren Gründen denken kann, warum der Standard dies eingeschränkt haben würde:

  
      
  1. Performance:

         

    Eine zusätzliche Anweisung könnte die delete Leistung verlangsamen.

  2.   
  3. Könnte es wegen const Zeiger sein.

         

    Dann wieder Standard etwas für diesen speziellen Fall getan haben könnte, denke ich.

  4.   

Kennt jemand genauen Gründe für diese nicht erlaubt?

War es hilfreich?

Lösung

Stroustrup selbst Antworten. Ein Auszug:

  

C ++ explizit erlaubt eine   Durchführung von Lösch auf Null out   ein L-Wert-Operanden, und ich hatte gehofft,   dass Implementierungen würde das tun,   aber diese Idee scheint nicht zu haben   populär geworden mit Implementierer.

Aber das Hauptproblem er aufwirft, ist dieses Argument ist löschen braucht keine L-Wert zu sein.

Andere Tipps

Als erste auf null einstellen würde ein Speicher gespeichert Variable. Es ist wahr, dass Sie in der Regel einen Zeiger in einer Variablen haben, aber manchmal möchten Sie vielleicht löschen ein Objekt an einer gerade berechneten Adresse. Das wäre unmöglich mit „zunichte gemacht“ löschen.

Dann kommt die Leistung. Sie könnten Code so geschrieben, dass der Zeiger den Gültigkeitsbereich verlassen wird unmittelbar nach dem Löschen erfolgt. Füllen Sie es mit null ist nur eine Verschwendung von Zeit. Und C ++ ist eine Sprache mit „braucht es nicht? Dann müssen Sie nicht dafür bezahlen“ Ideologie.

Wenn Sie Sicherheit brauchen es gibt eine große Auswahl an Smart-Pointer auf Sie Service oder Sie können Ihre eigenen schreiben -. Besser und intelligenter

Sie können mehrere Zeiger haben auf diesen Speicher zeigt. Es wäre ein falsches Gefühl der Sicherheit erstellen, wenn der Zeiger Du für den Lösch angegeben auf null gesetzt wurde, aber alle anderen Zeiger nicht. Ein Zeiger ist nichts anderes als eine Adresse, eine Nummer. Es könnte auch ein int mit einem dereferenzieren Betrieb sein. Mein Punkt ist, würden Sie müssen auch jeden einzelnen Zeiger scannen diejenigen zu finden, die den gleichen Speicher verweisen Sie gerade gelöscht, und sie auch null aus. Es wäre rechenintensiv sein, alle Zeiger für diese Adresse zu scannen und null sie aus, weil die Sprache nicht dafür ausgelegt ist. (Obwohl einige andere Sprachen ihre Referenzen strukturieren ein ähnliches Ziel in einer anderen Art und Weise zu erreichen.)

Ein Zeiger kann in mehr als einer Variablen gespeichert werden, würde einer von ihnen auf NULL Einstellung noch ungültige Zeiger in den anderen Variablen lassen. Sie brauchen also wirklich nicht viel gewinnen, sind Sie eher ein falsches Gefühl der Sicherheit zu schaffen.

Neben dem, dass können Sie Ihre eigene Funktion erstellen, das tut, was Sie wollen:

template<typename T>
void deleten(T *&ptr) {
  delete ptr;
  ptr = NULL;
}

Da ist es nicht unbedingt nötig, und weil sie löschen würde erfordern, Zeiger auf Zeiger nehmen, anstatt nur den Zeiger.

delete wird meist in Destruktoren verwendet, wobei in diesem Fall die Einrichtung eines Mitglied auf NULL ist sinnlos. Ein paar Zeilen später, bei dem Abschluss }, das Mitglied nicht mehr existiert. In Zuweisungsoperator wird ein Lösch typischerweise durch eine Zuweisung gefolgt sowieso.

Auch wäre es den folgenden Code illegal machen

T* const foo = new T;
delete foo;

Wenn Sie ein Array von Zeigern haben, und Ihre zweite Aktion ist das leere Feld zu löschen, dann gibt es keinen Punkt, jeden Wertes Einstellung auf Null, wenn der Speicher im Begriff ist, befreit zu werden. Wenn Sie es haben null wollen .. schreiben null es:)

Hier ist ein weiterer Grund; nehme löschen nicht gesetzt sein Argument auf NULL:

int *foo = new int;
int *bar = foo;
delete foo;

Sollte bar erhalten auf NULL gesetzt? Können Sie sich das verallgemeinern?

C ++ können Sie Ihre eigenen Bediener neu definieren und löschen, so dass zum Beispiel würden sie Ihren eigenen Pool Allocator verwenden. Wenn Sie dies tun, dann ist es möglich, neue zu nutzen und mit den Dingen löschen, die nicht streng Adressen sind aber sagen Indizes in Ihrem Pool-Array. In diesem Zusammenhang könnte der Wert von NULL (0) eine rechtlichen Bedeutung (in Bezug auf das erste Element in dem Pool).
Also mit NULL löscht Satz automatisch auf ihr Argument hat nicht immer die Bedeutung von - setzen Sie den Wert auf einen ungültigen Wert. Der ungültige Wert kann nicht immer NULL sein.

Philosophie von C ++ ist „dafür zahlen nur, wenn Sie es verwenden“. Ich denke, es kann Ihre Frage beantworten.

Auch manchmal könnten Sie Ihre eigene Haufen haben, die .. gelöschte Speicher erholen wird oder manchmal nicht durch irgendeine Variable im Besitz-Zeiger. Oder Zeiger in wenigen Variablen gespeichert - ist es möglich Null nur einer von ihnen
. Wie Sie es viele Fragen und mögliche Probleme sehen haben.

Zur Einstellung der Zeiger automatisch auf NULL würde die meisten Probleme mit schlechter Zeiger Nutzung nicht lösen. Der einzige Absturz es vermeiden würde, ist, wenn Sie versuchen, es zweimal zu löschen. Was passiert, wenn Sie einen Zeiger eine Memberfunktion auf solche nennen? Es wäre immer noch abstürzen (unter der Annahme, dass es Membervariablen zugreift). C ++ nicht beschränken Sie aus einer beliebigen Funktion auf NULL-Zeiger aufrufen, noch sollte es, dass der Blick von Performance Punkt tun.

Ich sehe Menschen seltsame Antworten auf diese Frage zu geben.

ptr = NULL; Wie kann so eine einfache Erklärung Ursache Leistung Verzögerung?

Eine andere Antwort zu sagen, dass wir mehrere Zeiger zeigt auf die gleiche haben Speicherplatz. Sicherlich können wir. In diesem Fall löscht Operation auf einem Zeiger würde nur den Zeiger NULL (wenn löschen machten Zeiger NULL) und der andere Zeiger wäre nicht-NULL und zeigt auf Speicherplatz machen, die frei ist.

Die Lösung hierfür soll, dass Benutzer hat alle Zeiger löschen sollten gleiche Stelle zeigen. Intern sollte prüfen, ob Speicher bereits freigegeben wird als nicht frei machen. Nur den Zeiger NULL machen.

Stroustrup haben könnte entworfen löschen auf diese Weise zu arbeiten. Er dachte Programmierer darum kümmern würde. Also hat er ignoriert.

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