C++ - Zeiger und Referenz mit dem Schlüsselwort new bei der Instanziierung von
Wenn ich will, zu instanziieren einer Klasse in C++ normalerweise gehe ich diesen Weg
Book bk = new Book();
Mein professor hat kürzlich diese
Book &bk = *new Book();
Er nur mir gesagt, er würde verwenden Sie eine Referenz, um in der Lage sein, um den Punkt verwenden (z.B. bk.getTitle ();) - operator anstelle von Pfeil (z.B. bk->getTitle();). Ich verstehe diesen Teil des Codes aber was passiert, wenn Sie mit der * - operator in Kombination mit der neuen?
Vielen Dank im Voraus
das vollständige Codebeispiel finden hier es ist die arraystack in der main-Funktion
- So Ihr professor zeigte, wie man ein Speicherleck, toll.
- Wenn dein professor verwendet, der code für alles andere, als ein Beispiel für etwas, das Sie wirklich nicht tun sollten, dann sollten Sie einen neuen professor.
- Wahrscheinlich ist dein professor gesagt,
const Book &bk = Book();
. Wenn das nicht der Fall, ich weiß es ehrlich gesagt nicht verstehen, was Ihr Lehrer meinte. - Die syntax in der Frage gültig ist, es ist die Semantik, die extrem fehlgeleitet.
- das vollständige Beispiel finden Sie hier. vielleicht macht dies mehr Sinn dann. das Teil ist in der main-Funktion. seine arraystack. Quelle
- Jetzt verstehe ich. Aber mit dieser syntax kann ich tun -
delete bk;
. Ist das nicht ein Fall, wo der Speicher Leck ist unvermeidlich? - Sie konnte tun
delete &bk
, aber das ist immer noch non-sense. @OP Finden Sie einen neuen professor.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese:
ist ziemlich äquivalent zu dieser:
Aber es gibt einen entscheidenden Unterschied; in den ursprünglichen code, die Sie nicht haben einen Zeiger, die Sie verwenden können, um
delete
den dynamisch reservierten Objekts, wenn Sie fertig sind mit es, Sie haben also effektiv erstellt ein Speicher-Leck.Natürlich, Sie könnten dies tun:
aber das ist extrem nicht-idiomatischen C++, und sehr wahrscheinlich zu Problemen führen später.
In der Zusammenfassung, es gibt absolut keinen guten Grund, um code zu schreiben, so tun Sie es nicht. Eine der folgenden Ordnung:
delete &bk
führt zu allen Arten von semantischen Problemen, die wiederum dazu führen, zu vergessen, zu reinigen, etwas, irgendwo auf der ganzen Linie.Ich gefunden habe, eine situation, die mich nachdenken lassen über die syntax. Betrachten Sie einen intelligenten Zeiger um eine
Base
Klasse und das ist halt ein Zeiger auf eine abgeleitete Klasse, und Sie möchten, um Zugriff auf einige nicht-virtuelle Dinge der abgeleiteten Klasse nach dem Bau. In diesem Fall ist so etwas legal und kann nicht so schlimm:Schließlich habe ich immer noch bevorzugt die kleinen Pfeile, um die seltsame kaufmännische und-Zeichen:
Aber ich denke, dass in so einem Fall ist nur eine Frage des Geschmacks, vor allem, wenn Sie Zugriff auf eine konsistente Anzahl von Methoden.
Andere Dinge, die führen entweder auf Undichtigkeiten oder
delete &d;
sind einfach nur schlecht, schlecht, schlecht.