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: 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? P> p>
3 Réponses :
Mais la chaîne pointée par 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 code> est uniquement bien définie jusqu'à ce que le
std :: string code> est ensuite modifié (ou détruit). P>
c_str code> doit fonctionner dans O (1) heure; alors la copie n'est donc pas autorisée. P>
Bon à savoir. C'est presque comme obliger une certaine implémentation de la classe STD :: String Code>, à savoir comme une éventail de caractères.
de http://www.cplusplus.com/reference/string/string/ C_STR / : P>
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. P> blockQuote>
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é. P>
Il est garanti de rester valable jusqu'à ce que la chaîne STD :: String est modifiée de quelque manière que ce soit. p>
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 (). P>
" ou une seule chaîne C peut exister à partir d'une chaîne donnée à tout moment i>" Voici comment
std :: string code> fonctionne - Quel est le problème?
Si
strncpy () code> 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.