Question

D'accord, je travaille sur le code de quelqu'un d'autre. Ils font beaucoup de cela:

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

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

Visual Studio continue également à signaler les fuites de mémoire, ce qui est en grande partie lié aux chaînes utilisées.

Ps. Oui, je connais std :: string, oui, je l'utilise. Ce n'est pas mon code.

Était-ce utile?

La solution

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

char description[256] = {0};

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

Définir simplement le premier élément sur 0 ( '\ 0' ) n'efface pas son contenu. Cela ne garantit même pas que la chaîne entière est définie sur le caractère null.

Comme d'autres l'ont déjà indiqué, vous ne pouvez pas "effacer". objets créés de manière statique jusqu'à la fermeture de la fonction, puis l'abandon. Techniquement, il n'est pas non plus effacé lorsque la fonction est abandonnée - le pointeur de pile est simplement modifié. Si vous êtes paranoïaque à propos de l'effacement des données, vous devriez parcourir le tableau en définissant chaque entrée sur 0 ( '\ 0' ).

Autres conseils

Définir le premier élément du tableau de caractères sur \ 0 est suffisant pour garantir que 'description' est une chaîne réelle correctement formatée. Les éléments 1 à 255 peuvent tous être des déchets, 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 le tableau est alloué sur la pile. Une fois qu'il est sorti de la pile (sort du cadre), le tableau de caractères est désalloué.

Cette chaîne est allouée sur la pile. Il n’ya donc aucun moyen de libérer la mémoire qu’elle utilise tant que la fonction dans laquelle elle est appelée n’est pas retournée (quand elle se produira automatiquement). Sauf si vous appelez cette fonction de manière récursive *, il n’ya aucune chance que cela devienne une fuite de mémoire, car une fois la fonction renvoyée, l’espace est utilisé pour les futurs cadres de pile. Et si vous êtes préoccupé par la sécurité, vous devriez simplement parcourir les éléments de la chaîne et les mettre à zéro.

Si vous voulez un bloc de mémoire libre (), vous pouvez procéder comme 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

* il ne s'agit pas d'une fuite de mémoire réelle, mais certaines personnes disent "fuite de mémoire". quand ils veulent dire "à court de mémoire". Dans tous les cas, l’espace de pile est beaucoup plus limité que l’espace de tas, vous devez donc surveiller la taille des blocs de mémoire que vous utilisez ici.

Pour clarifier les bonnes réponses données jusqu'à présent:

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

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

  • L'élément de code que vous citez ne peut pas provoquer de fuite de mémoire. La mémoire n'est pas allouée sur le segment de mémoire et les fuites de mémoire sont un problème de segment de mémoire.

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

S'il s'agit d'une chaîne char [] et que les seules opérations effectuées sur celle-ci sont des fonctions de chaîne, tout va bien. Bien sûr, cela ne suffit pas 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ûres des fonctions de chaîne, mais vous ne pouvez pas diffuser de chaînes statiques ou basées sur une pile. C’est donc probablement à un endroit où votre chaîne est transmise.

Par souci de clarté, je le changerais en '\ 0'.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top