Maison > développement back-end > C++ > le corps du texte

Pourquoi `c_str()` fonctionne-t-il sur un `std::string` désalloué dans ce cas ?

Barbara Streisand
Libérer: 2024-10-26 16:24:30
original
597 Les gens l'ont consulté

 Why Does `c_str()` Work on a Deallocated `std::string` in This Case?

Comprendre le retour implicite dans une fonction C

En C, lors du passage d'une chaîne littérale à une fonction, le compilateur la convertit implicitement en un std::objet chaîne. Cependant, dans l'exemple suivant, nous renvoyons un littéral de chaîne de style C à partir d'une fonction std::string :

<code class="cpp">std::string myFunction() {
    return "it's me!!";
}</code>
Copier après la connexion

Cela soulève un problème car le constructeur std::string implicitement appelé ici crée une copie de la chaîne littérale. Lorsque la fonction revient, cette copie doit être libérée, laissant un pointeur pendant.

Que se passe-t-il lorsque vous appelez c_str() ?

Cependant, vous appelez myFunction(). c_str() renvoie un pointeur vers les données stockées dans l'objet std::string. Ce pointeur pointe vers la même mémoire qui contenait la chaîne littérale, même après la désallocation de l'objet std::string.

Pourquoi cela fonctionne (en quelque sorte)

Le La raison pour laquelle ce code semble fonctionner est due à une bizarrerie de la gestion de la mémoire du système d'exploitation. Lorsqu'un bloc de mémoire est libéré, le système d'exploitation n'efface pas toujours son contenu. Cela signifie que les données du littéral de chaîne sont toujours présentes en mémoire, même si elles sont techniquement inaccessibles.

Comportement et chance non définis

Il est important de noter que ce comportement n'est pas défini selon la norme C. Cela signifie que tout peut arriver, y compris des plantages ou des résultats incorrects. Cela fonctionne dans certains cas, non pas grâce aux bonnes pratiques C, mais à cause des détails d'implémentation du système d'exploitation.

Par conséquent, il est crucial d'éviter de se fier à ce comportement et de toujours s'assurer que les données sont correctement allouées et libérées dans votre code C. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!