Maison  >  Article  >  développement back-end  >  Pourquoi `c_str()` fonctionne-t-il sur un `std::string` désalloué dans ce cas ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-26 16:24:30599parcourir

 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>

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!

Déclaration:
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