2008-11-20 8 views
2

Ok je travaille sur quelqu'un Code elses. Ils font beaucoup de ceci:Effacement d'un Char []

char description[256]; 
description[0]=0; 

Je sais cela mettre un \ 0 dans la première place du tableau de caractères. Mais est-ce même un moyen sûr d'effacer une chaîne?

également visual studio conserve rapporter les fuites de mémoire, et je l'ai à peu près à égalité ce fait aux chaînes qui sont utilisées.

Ps. Oui, je sais à propos de std :: string, oui je l'utilise. Ce n'est pas mon code.

+0

Pourriez-vous clarifier "j'ai à peu près lié cela aux cordes qui sont utilisées"? Je ne peux pas tout à fait l'analyser ... – Arkadiy

Répondre

8

Pour initialize la chaîne à 0, vous pouvez faire:

char description[256] = {0}; 

qui attribuera 0 à chaque élément du tableau.

Le simple paramétrage du premier élément à 0 ('\0') n'efface pas son contenu. Il ne garantit même pas que la chaîne entière est définie sur le caractère nul.

Comme indiqué par d'autres, vous ne pouvez pas « effacer » les objets créés statiquement jusqu'à ce que la fonction ferme, quand il est abandonné. Techniquement, il n'est pas effacé lorsque la fonction est abandonnée non plus - le pointeur de pile est simplement changé. Si vous êtes paranoïaque à propos des données effacées, vous devez parcourir le tableau en réglant chaque entrée sur 0 ('\0').

4

Cette chaîne est allouée sur la pile, donc il n'y a aucun moyen de libérer la mémoire qu'il utilise jusqu'à ce que la fonction qu'il appelle des rendements (quand cela se produira automatiquement). Sauf si vous appelez cette fonction de manière récursive *, il n'y a aucun moyen que cela finisse par être une fuite de mémoire, car une fois la fonction retournée, l'espace est utilisé pour les futures trames de pile. Et si vous êtes préoccupé par la sécurité, vous devriez simplement boucler et mettre à zéro les éléments de la chaîne.

Si vous voulez un logiciel gratuit() - bloc de mémoire capable, vous pouvez faire ce qui suit et allouer le tableau sur le tas:

char *str = malloc(256*sizeof(char)); // str now is a pointer to a 256-char array 
... 
// some code here 
... 
free(str); // free the memory 

* ce n'est pas une fuite de mémoire acutal, mais certaines personnes disent " fuite de mémoire "quand ils signifient" manquer de mémoire ". Dans tous les cas, l'espace de pile est beaucoup plus limité que l'espace de tas, vous devez donc regarder la taille des blocs de mémoire que vous utilisez là.

+0

Ce ne sera pas une fuite de mémoire même lorsqu'elle est appelée récursivement (il peut y avoir un bug dans la récursivité qui vous fait manquer de mémoire, mais je ne le caractériserais pas comme un "fuite", en soi). –

+0

Vrai, mais parfois les gens disent "fuite de mémoire" quand ils veulent dire "J'ai manqué de mémoire" –

+0

Potentiellement ce tableau pourrait être dans une classe, si la classe est divulguée alors tout le tableau est divulgué. Selon les outils utilisés par le PO, les choses peuvent prêter à confusion. – coryan

3

Mettre \0 dans le premier élément d'une chaîne est un moyen sûr de claire la chaîne, mais ce n'est pas la même chose que la suppression de la chaîne et n'empêchera pas les fuites de mémoire.

1

S'il s'agit d'une chaîne char [], et que les seules opérations effectuées sont des fonctions de chaîne, c'est bon. Bien sûr, ce n'est pas assez bon pour les données protégées. En ce qui concerne les fuites de mémoire, il peut être utile de passer aux versions sécurisées des fonctions de chaîne, mais vous ne pouvez pas fuir les chaînes statiques ou basées sur des piles, donc c'est probablement un endroit où votre chaîne est transmise.

Pour plus de clarté, je changerais à '\ 0'.

+0

Je pensais qu'il n'y avait aucune garantie que le caractère NUL ('\ 0') aurait une valeur nulle. Plus de clarté est obtenue en utilisant '\ 0', vous rendez votre code portable à toutes ces plates-formes non-ASCII là-bas. Ce dont vous pouvez ou ne pouvez pas vous soucier. – coryan

+0

Je suis assez sûr que si NUL est spécifique à ASCII, et que null peut être quelque chose tant que c'est toujours le cas, '\ 0' doit être zéro. – Mark

+0

La norme garantit que le terminateur null utilisé pour indiquer la fin d'une chaîne est entier 0. – coppro

8

Réglage du premier élément du tableau de caractères à \ 0 est suffisant pour faire en sorte que « description » est un correctement formaté, chaîne réelle. Les éléments 1 à 255 peuvent tous être corrompus, tant que l'élément 0 est 0, la description est une chaîne de longueur nulle.

Vous n'avez pas à vous soucier des fuites de mémoire dans le code affiché ci-dessus, car la baie est allouée sur la pile. Une fois qu'il tombe de la pile (sort de la portée), le tableau char est désalloué.

4

Pour clarifier les bonnes réponses à ce jour:

  • Oui, description [0] = 0 efface la chaîne de fonctions strxxx POW: strlen (description) == 0, strcmp (description "") == 0 et std :: string (description) == "" sont toutes vraies.

  • Non, la description [0] = 0 n'est pas la même chose que libre (description) ou memset (description, 0, taille de la description). Mais vous le saviez déjà.

  • Le code que vous citez ne peut pas entraîner de fuite de mémoire. La mémoire n'est pas allouée sur le tas, et les fuites de mémoire sont une chose de tas.