2010-11-20 12 views
1

Ich habe diesen Code:Umgang mit Zeichen in C++ (ohne std :: string)

char* value = "abcdefg"; 

char* secondValue = value; 

Der zweite Wert ok die addres des Wertes erhalten wird? Wenn ich "value" lösche, ist der secondValue nicht verfügbar, oder?

so soll ich tun:

char* value = "abcdefg"; 
secondValue = new char[strlen(value)]; 
strcpy(secondValue, value); 

Wenn ich also "Wert" kein Problem löschen.

Und schließlich die second dealloc ich tun sollte:

delete[] secondValue; 

bin ich recht?

+1

Ihre Fragen sind markiert und betitelt C, aber "löschen" ist C++ - Syntax. Deine Frage ist etwas durcheinander. –

+0

neu/löschen? Das ist C++.Vielleicht sollten Sie sich std :: string ansehen. –

+0

ok Ich werde den Titel ändern, ich habe keinen Zugriff auf std Zeug auf der Komponente, die ich verwende. – okami

Antwort

6

Es gibt zwei Probleme mit dem, was Sie geschrieben haben:

  1. Sie können char *value = "abcdefg"; nicht löschen, da es auf dem Heap nicht zugeordnet ist. Um den Heapspeicher zuzuweisen, verwenden Sie new (in C++) oder malloc (in C).

  2. Wenn Sie Speicher für eine Zeichenfolge reservieren, benötigen Sie immer ein zusätzliches Byte für die Null-Beendigung.

In Ihrem Fall sollten Sie getan haben:

secondValue = new char[strlen(value)+1]; 

Other than that, sind Sie richtig

3

Wenn Sie mit C++ Sie richtig sind, mit der Ausnahme, dass Sie secondValue vornehmen müssen ein Zeichen größer:

secondValue = new char[strlen(value) + 1]; 

C-Strings mit einembeendet werdenZeichen, die auch Speicherplatz benötigen, um gespeichert zu werden.

Wenn Sie C verwenden anstelle von C++ gibt es keine new oder delete[] und Sie müssen die Funktionen verwenden malloc() und free() statt:

secondValue = malloc(strlen(value) + 1); 
... 
free(secondValue); 

In jedem Fall beachten Sie, dass in dem Beispiel value ein String Literal, das nicht gelöscht/freigegeben werden kann. Sie sollten nur löschen/freigeben, was Sie jeweils mit new/malloc zugewiesen haben.

1

Die Art und Weise geschrieben Sie Ihren Code:

char* value = "abcdefg"; 

Der Compiler eine statische Zeichenfolge "abcdefg", generieren und value wird ein Zeiger auf das sein. Sie können secondvalue = value zuweisen und haben dann value go out of scope, and Sekundenwert ist weiterhin gültig.

In Ihrem Beispiel gibt es keine andere Möglichkeit, die Zuordnung aufzuheben value.

+0

also, wenn der char * value = "abcdefg"; ist eine innere Struktur wie struct {char * value; } MyStruct; die "Wert" -Daten werden eine statische sein, selbst wenn ich ein Objekt vom Typ MyStruct lösche? – okami

+0

Ja, ** wenn ** Sie "Wert" mit einer statischen Konstante initialisiert haben. –

Verwandte Themen