2010-11-20 4 views
1

J'ai ce code:Faire face à caractères en C++ (sans std :: string)

char* value = "abcdefg"; 

char* secondValue = value; 

La deuxième valeur obtenir les addres de valeur ok? Si je supprime "valeur" la deuxième valeur ne sera pas disponible ai-je raison?

donc je dois faire:

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

donc si je supprime la "valeur" pas de problème.

Et enfin dealloc le SecondValue que je dois faire:

delete[] secondValue; 

suis-je raison?

+1

Vos questions sont étiquetées et intitulées C, mais 'delete' est la syntaxe C++. Votre question est un peu confuse. –

+0

nouveau/supprimer? C'est C++.Peut-être devriez-vous regarder std :: string. –

+0

ok Je vais changer le titre, je n'ai pas accès à des trucs standards sur le composant que j'utilise. – okami

Répondre

6

Il y a deux problèmes avec ce que vous avez écrit:

  1. Vous ne pouvez pas supprimer char *value = "abcdefg";, car il n'est pas alloué sur le tas. Pour allouer la mémoire de segment, utilisez new (en C++) ou malloc (en C). Lorsque vous allouez de la mémoire pour une chaîne, vous avez toujours besoin d'un octet de plus supplémentaire pour la terminaison NULL.

Dans votre cas, vous auriez dû faire:

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

Autre que cela, vous avez raison

3

Si vous utilisez C++, vous avez raison, sauf que vous devez faire secondValue un caractère plus:

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

chaînes de type C se terminent par un '\0' caractère, qui a également besoin d'espace pour être stocké.

Si vous utilisez C au lieu de C++, il n'y a pas new ou delete[] et vous devez utiliser les fonctions malloc() et free() à la place:

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

Dans une note de cas que dans l'exemple value est une chaîne littéral, qui ne peut pas être supprimé/libéré. Vous devriez seulement supprimer/libérer ce que vous avez alloué avec new/malloc respectivement.

1

La façon dont vous avez écrit votre code:

char* value = "abcdefg"; 

Le compilateur génère une chaîne statique "abcdefg" et value sera un pointeur vers cela. Vous pouvez attribuer secondvalue = value puis avoir value go out of scope, and secondvalue` sera toujours valide. Dans votre exemple, il n'y a pas d'autre moyen de libérer value.

+0

donc si le char * value = "abcdefg"; est une structure interne comme struct {char * value; } MyStruct; les données "valeur" seront une donnée statique même si je supprime un objet de type MyStruct? – okami

+0

Oui, ** si ** vous avez initialisé 'value' avec une constante statique. –

Questions connexes