27 votes

Est-ce que std::string::assign prend la "propriété" de la chaîne ?

J'ai quelques lacunes dans la compréhension de string::assign méthode. Considérons le code suivant :

char* c = new char[38];
strcpy(c, "All your base are belong to us!");
std::string s;
s.assign(c, 38);

Fait s.assign allouer un nouveau tampon et y copier la chaîne de caractères ou prendre possession du pointeur ; c'est-à-dire ne pas allouer de nouvelle mémoire et utiliser directement mon adresse. Si elle copie, quelle est la différence entre assign y operator= ? S'il ne copie pas, alors il libère la mémoire ou c'est ma responsabilité ?

Gracias.

32voto

Konrad Points 8333

Est-ce que s.assign alloue un nouveau tampon et y copie la chaîne de caractères ou assume-t-il la propriété du pointeur ?

La méthode STL des chaînes de caractères assign copiera le tableau de caractères dans la chaîne de caractères. Si le tampon déjà alloué à l'intérieur de la chaîne est insuffisant, il réallouera la mémoire en interne. La chaîne STL no prendre la propriété du tableau original.

Si c'est une copie, alors quelle est la différence entre assign et operator= ?

Les deux devraient agir de la même manière, mais il existe un certain nombre de surcharges de la méthode STL assign qui vous permettent de mieux contrôler ce qui se passe. Jetez un coup d'œil à cette page pour plus d'informations.

MISE À JOUR : Le MSDN propose un certain nombre d'exemples des différents assign les surcharges.

S'il ne copie pas, alors il libère la mémoire ou c'est ma responsabilité ?

Non, le pointeur original vers le tableau de caractères est toujours sous votre responsabilité.

17voto

A. Levy Points 8344

Il copie. La différence entre attribuer y opérateur= est que vous pouvez spécifier le nombre de caractères à copier. y compris les caractères nuls . L'opérateur= copie simplement la chaîne c jusqu'au premier octet nul.

1voto

fmuecke Points 4790

Autant que je m'en souvienne, cela dépend de l'implémentation de votre compilateur. Certains peuvent utiliser des optimisations de type "copy-on-write" et donc ne pas créer de copie tant que vous ne modifiez pas la valeur. Cependant, la plupart des implémentations se contenteront de copier la chaîne de caractères.

Mais toutes les implémentations se chargent du nettoyage - il n'est donc pas nécessaire de libérer manuellement la mémoire des chaînes de caractères (c'est le rôle des objets chaîne de caractères). Bien sûr, vous devez libérer vos objets string, s'ils sont créés sur le tas (ou utiliser un smartpointer) ;)

Assign et operator= peuvent être implémentés l'un par rapport à l'autre car ils font la même chose - en fonction de la version d'assign qui est appelée (pour toutes les surcharges voir référence cpp ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X