Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C String aufräumen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.08.2009, 08:00 Uhr
Lensflare



Hallo wieder mal

wie räumt man in C++ eigentlich C-Strings wieder auf?

C++:
char *s = "test";




C++:
delete s; //=> Laufzeitfehler




C++:
delete[] s; //=> Laufzeitfehler




C++:
free(s); //=> Laufzeitfehler


--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 08.08.2009 um 08:01 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.08.2009, 11:53 Uhr
RedEagle



"test" ist eine Konstante, die sich wie andere Konstanten in einer Sektion in der executable befindet. "test" wird mit anderen Konstanten in einen vor dem Programmstart reservierten Speicherbreich gelegt.
Da du den Speicherbereich also nicht zur laufzeit des Programmes reservierst, kannst du ihn auch nicht freigeben.

Anderes Beispiel:

C++:
char *s;
s = malloc(sizeof("test")+1);
strcpy(s, "test");
/*
"test" liegt nun einmal als Konstante vor, und einmal als Variable (s) in einem durch malloc reservierten Speicherbreich auf dem Heap. Der durch malloc reservierte Bereich muss per Hand wieder freigegeben werden, wenn man s nicht mehr braucht, um dort später Platz für andere Variablen zu haben
*/

free(s);

--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.08.2009, 11:56 Uhr
0xdeadbeef
Gott
(Operator)



C++:
char *s = "test";


Ein C++-Compiler ist durchaus dazu befugt, dir das um die Ohren zu hauen.

C++:
char const *s = "test";


so geht's.

Ansonsten, free(), was mit malloc() oder calloc() angefordert wurde, delete was mit new angefordert wurde, delete[] was mit new[] angefordert wurde. Alles andere kümmert sich um sich selbst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.08.2009 um 11:59 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.08.2009, 12:45 Uhr
Lensflare



jetzt wo ich das sehe fällt es mir auch wieder ein dass C-Strings const sind.

Und jetzt bin ich verwirrt.
Der Compiler baut den folgenden Code ohne Fehler oder Warnungen:


C++:
    char *s = "test";
    s = "hallo";
    s[1] = 'e';

    std::cout << s;



Ausgabe ist:

Code:
hallo



Die Zeichenkette scheint also konstant zu sein.
"test" wäre jetzt jedoch unauffindbar und würde nur unnötig Speicher belegen.

Und eine weitere Frage die sich mir stellt ist:
Wie kann eine Zeichenkette, die ja primitiv ist, konstant sein im Sinne davon, dass man einzelne Zeichen nicht ändern kann? Doch nur indem man diese als const array oder als const zeiger definiert.
Hier ist der zeiger scheinbar nicht konstant. Wieso kann ich dann den buchstaben 'a' nicht in 'e' ändern?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 08.08.2009 um 12:46 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.08.2009, 13:16 Uhr
Lensflare




Zitat von RedEagle:


C++:
char *s;
s = malloc(sizeof("test")+1);
strcpy(s, "test");
/*
"test" liegt nun einmal als Konstante vor, und einmal als Variable (s) in einem durch malloc reservierten Speicherbreich auf dem Heap. Der durch malloc reservierte Bereich muss per Hand wieder freigegeben werden, wenn man s nicht mehr braucht, um dort später Platz für andere Variablen zu haben
*/

free(s);




Ok da kopierst du den Wert der Konstanten "test" und verweist dann mit einem nicht konstanten Zeiger auf diesen neuen Wert. Aber die Konstante "test" bleibt doch dann trotzdem im Speicher bis das Programm beendet wird, oder?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 08.08.2009 um 13:19 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.08.2009, 13:30 Uhr
0xdeadbeef
Gott
(Operator)



Zitat von Lensflare:


C++:
    char *s = "test";
    s = "hallo";
    s[1] = 'e';

    std::cout << s;




Dass der Code funktioniert und was er macht ist rein zufällig - undefiniertes Verhalten halt. Rechne mit Segfaults. Warum der bei dir macht, was er macht, anstatt einfach abzustürzen, kann ich mit Sicherheit auch nicht sagen. Meine Vermutung ist, dass das Literal in einem nicht schreibbaren Speicherbereich liegt, das Betriebssystem Schreibversuche dahin aber nicht als kritisch betrachtet und einfach verwirft.

Was hier wichtigerweise const ist, sind übrigens Stringliterale, nicht Strings allgemein, und dass ein Zeiger variabel ist, heißt nicht, dass auch das, worauf er zeigt, variabel ist.

C++:
char const *p = "foo";
++p;


ist legaler Code, p zeigt danach auf "oo" - const bezieht sich immer nur auf das, was direkt zu seiner Linken steht (es sei denn, es steht ganz links, dann bezieht es sich auf das, was direkt zu seiner Rechten steht). Ein konstanter Zeiger wäre

C++:
char const *const p = "foo";


...und dann funktioniert auch ++p nicht mehr.

Wie lange Literale und vergleichbare Daten im Speicher liegen bleiben, ist compiler- und laufzeitabhängig. Es kann aber durchaus sein, dass sie für die Dauer des Prozesses vorhanden bleiben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.08.2009 um 13:36 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.08.2009, 13:43 Uhr
Lensflare



Hab noch einmal den Thread durchgelesen und ich denke, dass ich es jetzt verstehe.
Vielen Dank.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: