Konstante Zeiger?
-
Moin allerseits,
meiner einer fragt sich wozu konstante Zeiger denn nützlich sind.
Ich sehe nur den Nachteil das man sie nach einem 'delete' aufruf
nicht in Nullzeiger umwandeln kann und somit einen ungesunden
Zeiger übrig hat.int * const pInt = new int; delete pInt; pInt=0; // iss nicht!
-
Original erstellt von Fox112:
meiner einer fragt sich wozu konstante Zeiger denn nützlich sind.Sie zeigen immer auf die gleiche Stelle. Ich habe mal gehört, dass man mit so einem Zeiger mehr machen kann, als ihn mit 'new' zu belegen.
Was erhoffst Du dir davon, aus 'pInt' einen Nullzeiger zu machen? Gegen Fehler hilft es verhältnismäßig wenig, wenigstens was Lesezugriffe betrifft. In C++ ist es üblich, nicht so arg viel mit Zeigern rumzuhampeln, sondern das alles sachgerecht in Klassen zu kapseln. RAII heißt das dann.
-
Original erstellt von Daniel E.:
RAII heißt das dann.was ist RAII?
-
Gugle meint 'Resource Acquisition Is Initialization'. Wieso kann das jemand, der in 2 Minuten ein Antwortposting schreiben kann, nicht selbst herausfinden?
-
Ich erhoffe mir damit mögliche auftretende Probleme frühzeitig zu verhindern. Gehört doch zum guten Stil einen gelöschten Zeiger in einen Nullzeiger umzuwandeln.
Gruß, Fox112.
-
Original erstellt von Fox112:
Ich erhoffe mir damit mögliche auftretende Probleme frühzeitig zu verhindern. Gehört doch zum guten Stil einen gelöschten Zeiger in einen Nullzeiger umzuwandeln.
Gruß, Fox112.absolut nicht.
es gehört zum guten stil, daß geloschte sachen einfach weg sind. und wozu dann den leeren zeiger behalten?
-
Welche Fehler genau?
Um zu deinem Beispiel zurückzukommen:
int *const p = new int; /* ... */ delete p; /* p ist jetzt ungültig */ p = 0; /* -> Compilerfehler, aber lassen wir das einfach mal beiseite */ zwei(p); /* ¹ */ drei(*p); /* ² */
- Kommt auf 'zwei' an; es gibt angeblich Leute, die schreiben 'if(!p) return;' an den Anfang jeder Funktion. Andere tun das nicht. Hier ist ein Blick in die Dokumentation/den Quelltext angebracht (oder man schreibt so etwas einfach nicht, weil selbst dieser Code schon UB aufweist).
- Dieser Code ist objektivierbar kaputt und zwar unabhängig davon, ob p ein Nullzeiger oder ein anderer ungültiger Zeiger ist. Es gibt Systeme, die lassen das Dereferenzieren von Nullzeigern zu, andere terminieren das Programm. Es gibt Systeme, die lassen das Dereferenzieren von ungültigen Zeigern zu, andere terminieren das Programm. Vorteil?
-
int * const pInt = new int; *pInt=12; cout<<"*pInt: "<<*pInt<<endl; cout<<" pInt: "<< pInt<<endl; delete pInt; // Die Stelle des Heap auf die pInt zeigte ist jetzt freigegeben cout<<" pInt: "<< pInt<<endl; //Aber pInt zeigt immer noch auf die Stelle
Ich gehe davon aus das zur späterer Laufzeit Speicher auf dem Heap an dieser Stelle reserviert werden könnte. Da pInt noch immer darauf zeigt könnte Schaden
enstehen, und das nur weil kein Nullzeiger aus pInt gemacht wurde. Im MUT C++ in
21 Tagen wird dieses Phänomen als "vagabundierender Zeiger" beschrieben. Ist
pInt wie im Beispiel nun ein Konstanter Zeiger kann er nicht in einen Nullzeiger
umgewandelt werden => womöglich Ärger.
Aber abgesehen davon, wo liegen denn jetzt die eigentlichen Vorteile eines
konstanten Zeigers, abgesehen von einer Einschränkung bleibt mir der Sinn
weiterhin verborgen.Gruß, Fox112.
-
Original erstellt von Fox112:
Ist pInt wie im Beispiel nun ein Konstanter Zeiger kann er nicht in einen Nullzeiger
umgewandelt werden => womöglich Ärger.Nein. Nur wenn Du unbenutzte Zeiger benutzt, was natürlich Quatsch ist. Natürlich kann man auch 'zur Sicherheit' den gesamten Speicher ausnullen, oder so. Nützen tut das im Normalfall nie.
Aber abgesehen davon, wo liegen denn jetzt die eigentlichen Vorteile eines
konstanten Zeigers, abgesehen von einer Einschränkung bleibt mir der Sinn
weiterhin verborgen.Du kannst garantieren, dass der Zeiger immer auf das gleiche Element, <c++ in 21 Tagen>immer auf die gleiche Speicherstelle</>, zeigt. Ist das nichts?
-
Original erstellt von Fox112:
Aber abgesehen davon, wo liegen denn jetzt die eigentlichen Vorteile eines
konstanten Zeigers, abgesehen von einer Einschränkung bleibt mir der Sinn
weiterhin verborgen.ein zeiger muss nicht immer auf ein objekt zeigen, das per New angelegt wurde.
btw: einen zeiger zu NULLen ist boese, denn wenn du diesen dann nochmal deletest, ist das semantisch falsch, aber es gibt keinen fehler... boese...
ein NULL zeiger macht nur dann sinn, wenn du damit zeigen willst, er ist nicht initialisiert, zB bei einer smart pointer klasse die auf nichts zeigt, koennte ein 0-Zeiger anzeigen, dass diese klasse auf nix zeigt
und hoer lieber auf Profis wie volkard als auf anfaenger Buecher wie C++ in 21 Tagen
zurueck zum Problem:
ein zeiger zeigt wohin. er ist dann const wenn er nirgendwo anders hin zeigen kann...
Bsp:char const* const Konstante="Hallo Welt!";
es macht keinen sinn, das Konstante woanders als auf Hallo Welt zeigen sollte.
oder:
Klasse obj(foo); { Klasse* const zeiger=&obj; dosomething(zeiger); }
hier wuerde es auch keinen sinn machen das zeiger woanders als auf obj zeigen sollte...
genauso gut koenntest du fragen, was konstanten bringen
im prinzip bringts nix, aber man kann damit trotzdem ein paar interessante sachen machen, zB ist const-correctness ohne konstanten nicht moeglich...
-
Da vertraut man schonmal auf ein Buch und dann steht nur Scheiss drin. Werd mir das ganze nochma zu Herzen nehmen und durch den Kopf gehen lassen.
Danke allerseits.