6
votes

Comment STD :: String :: C_STR () Renvoie une chaîne C qui ne provoque pas de fuite de mémoire ou de contenu en c-chaîne non défini?

J'écris une classe de cordes similaire à STD :: String pour une affectation des devoirs, mais je ne peux pas comprendre comment renvoyer une chaîne C qui ne provoque pas de fuite de mémoire et n'est garantie de même que Ce n'est plus utilisé. J'ai actuellement: xxx

mais le contenu est remplacé peu de temps après son appel. Si je fais une allocation dynamique, j'aurai une fuite de mémoire ou une seule chaîne C peut exister à partir d'une chaîne donnée à tout moment. Comment puis-je éviter cela?


4 commentaires

" ou une seule chaîne C peut exister à partir d'une chaîne donnée à tout moment " Voici comment std :: string fonctionne - Quel est le problème?


Si strncpy () est la réponse, vous êtes probablement Demander la mauvaise question .


Je ne me suis pas réalisé qu'il devait exister seulement jusqu'à ce qu'il soit changé. Il fonctionne maintenant dans O (1) heure.


J'ai vu un horrible piratage une fois, dans le code qui avait d'énormes piles de chaînes temporaires qui ont continué à obtenir des bugs à usage après utilisation. Il a gardé un STD global :: deque des allocations C_STR et libéré un sur le devant lorsqu'il en fait une nouvelle. Compte tenu de tous les frais de verrouillage impliqués qui n'auraient peut-être pas été une bonne idée, mais c'était une solution rapide. Aussi horrible parce qu'il a redéfini STD :: String dans un fichier d'en-tête local, qui n'est censé pas être une bonne idée.


3 Réponses :


7
votes

Mais la chaîne pointée par c_str est uniquement bien définie jusqu'à ce que le std :: string est ensuite modifié (ou détruit).

Un moyen d'atteindre cela peut simplement être de retourner un pointeur sur votre tampon interne (en supposant que ce soit résilié par NULL). Gardez à l'esprit qu'un c_str doit fonctionner dans O (1) heure; alors la copie n'est donc pas autorisée.


1 commentaires

Bon à savoir. C'est presque comme obliger une certaine implémentation de la classe STD :: String , à savoir comme une éventail de caractères.



4
votes

de http://www.cplusplus.com/reference/string/string/ C_STR / :

Le tableau retourné pointe vers un emplacement interne avec le requis espace de stockage pour cette séquence de caractères et sa terminaison caractère nul, mais les valeurs de ce tableau ne doivent pas être modifiées dans le programme et ne sont garantis que de rester inchangés jusqu'à la prochaine Appelez à une fonction de membre non constant de l'objet String.


0 commentaires

0
votes

Le tampon retourné par C_STR () n'est pas garanti de rester identique ni même valable jusqu'à ce qu'il ne soit plus utilisé.

Il est garanti de rester valable jusqu'à ce que la chaîne STD :: String est modifiée de quelque manière que ce soit.

La mise en œuvre est simple: maintenez la représentation interne de la chaîne null terminée à tout moment et renvoyez un pointeur à la représentation interne de C_STR ().


0 commentaires