konstanten Zeiger löschen
-
Der WErt des Zeigers ist konstant!
Du kannst ihm also nach der initalisation
nichts anderes mehr zuweisen, auch nicht 0!
-
Der Zeiger ist nicht konstant, nur die Elemente des Arrays. Und der Code ist eigentlich auch ok, evtl. liegts am MSVC6?
-
@Storm.Xapek.de
Der Inhalt ist konstant und der Zeiger ist änderbar.@LordJaxom
Weisst du, ob es irgendwo im MSVC6 die Möglichkeit gibt, diese Fehlermeldung zu umgehen?
-
life_drake schrieb:
Der Zeiger ist konstant; der Inhalt aber änderbar!!!
Genau umgekehrt. Konstanter Zeiger wäre
int main() { char* const test = new char[150]; delete test; test =0; }Gibt einen Fehler in Zeile 5 weil der Zeiger konstant ist und die Zuweisung demnach illegal.
Weisst du, ob es irgendwo im MSVC6 die Möglichkeit gibt, diese Fehlermeldung zu umgehen?
Sorry,nein.
-
@LordJaxom
Ja danke! Ich war kurzzeitig verwirrt und habs erst gemerkt, als ich den Beitrag schon abgeschickt hab!
-
Hi,
nur mal zur Verdeutlichung, was das am Source bedeutet:
// Zeiger auf "konstante" Daten char const * Das_worauf_ich_zeige_darf_nicht_veraendert_werden = new char; *Das_worauf_ich_zeige_darf_nicht_veraendert_werden = 'a'; // Fehler !! Das_worauf_ich_zeige_darf_nicht_veraendert_werden = 0; // OK // "konstanter" Zeiger auf Daten char * const Wohin_ich_zeige_darf_nicht_veraendert_werden = new char; *Wohin_ich_zeige_darf_nicht_veraendert_werden = 'a'; // OK Wohin_ich_zeige_darf_nicht_veraendert_werden = 0; // Fehler !! // "konstanter" Zeiger auf "konstante" Daten char const * const Mit_mir_geht_gar_nix = new char; Mit_mir_geht_gar_nix = 'a'; // Fehler !! Mit_mir_geht_gar_nix = 0; // Fehler !!"Konstant" ist in dem Zusammenhang mißverständlich - es heißt nur: "Über diese Variable nicht veränderbar" Folgendes funktioniert nämlich:
char * unconst_Zeiger = new char; *unconst_Zeiger = 'a'; char const * const_Zeiger = unconst_Zeiger; *unconst_Zeiger = 'b'; cout << "const_Zeiger " << const_Zeiger << "\n"; // Huups: Nun hat sich auch der Speicher geändert, auf den const_Zeiger zeigt. delete unconst_Zeiger;Es ist IMO übrigens hilfreich, sich zu merken: "const wirkt nach hinten".
(einzige Ausnahme: Wenn const als erster Kennzeichner verwendet wird, wirkt es auf den nächsten: "const char *" == "char const *"; Leider in den meistens Sources mengenmäßig die Regel und nicht die Ausnahme)
Gruß,
Simon2.
-
Simon2 schrieb:
char const * Das_worauf_ich_zeige_darf_nicht_veraendert_werden = new char; delete Das_worauf_ich_zeige_darf_nicht_veraendert_werden; // Fehler !!Der Rest war ja bereits geklärt, aber dieser Aussage kann ich noch nicht zustimmen. Konstantheit hat IMHO nichts mit Allokation zu tun, sondern in diesem Fall lediglich mit dem Schutz des Allokierten. Deshalb behaupte ich dass z.B. folgendes vollkommen legal ist.
Point const* ursprung = new Point(0, 0); // ursprung->setX(1); das wollen wir verhindern delete ursprung; // wie sonst sollte ich ein Speicherleck vermeiden?EDIT:
ISO/IEC 14882:1998 schrieb:
5.3.5 Absatz 2
[Note: a pointer to a const type can be the operand of a delete-expression; it is not necessary to cast away the constness (expr.const.cast) of the pointer expression before it is used as the operand of the delete-expression. ]
-
LordJaxom schrieb:
Simon2 schrieb:
char const * Das_worauf_ich_zeige_darf_nicht_veraendert_werden = new char; delete Das_worauf_ich_zeige_darf_nicht_veraendert_werden; // Fehler !!Der Rest war ja bereits geklärt, aber dieser Aussage kann ich noch nicht zustimmen. Konstantheit hat IMHO nichts mit Allokation zu tun, sondern in diesem Fall lediglich mit dem Schutz des Allokierten. Deshalb behaupte ich dass z.B. folgendes vollkommen legal ist.
Point const* ursprung = new Point(0, 0); // ursprung->setX(1); das wollen wir verhindern delete ursprung; // wie sonst sollte ich ein Speicherleck vermeiden?Du hast Recht und ich Unrecht (sagt jedenfalls mein Compiler) !!!
- Hatte ich irgendwie anders im Kopf - werde das korrigieren.Dass ich das Ganze nochmal in Source gegossen habe, sollte vA der Veranschaulichung dienen ("1 Zeile Source sagt mehr als 1000 Worte"
).Danke für die Klarstellung,
Simon2.
-
Sicher war ich ja selbst nicht, bis ich es im Standard fand (s.o.) - deshalb ja auch "behaupte ich"

-
Hallo nochmal!
Um auf mein Problem zurückzukommen:
Kann mir jemand erklären, warum mein Compiler (MSVC6) folgende Fehlermeldung bringt:life_drake schrieb:
error C2665: 'delete' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'const char *' konvertiert werden
Bzw. wie kann ich das umgehen?
-
Nunja, warum er diesen Fehler bringt musst Du schon Microsoft fragen. Die offensichtlichste Antwort dürfte sein "weil sich MSVC6 in diesem Punkt nicht an ISO/IEC 14882:1998 hält".
Umgehen kannst Du es höchstens indem Du updatest (:D) oder die constness wegcastest (was laut Standard nicht notwendig ist):
delete const_cast<char*>(pointer); // oder, falls der MSVC6 selbst das nicht rafft delete (char*)pointer;
-
@LordJaxom
Wow! ... Bin hellauf begeistert ... es hat funktioniert! THX!Kann ich analog dazu ein Feld wie folgt löschen?
delete [](char*)buffer;P.S. Ich kann nicht updaten, weil das mein Rechner dann nicht schafft!
