"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-11
Parcourir:948

 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 une chaîne littérale de style C à partir d'une fonction std::string:

std::string myFunction() {
    return "it's me!!";
}

Cela soulève un problème car le constructeur std::string implicitement appelé ici crée une copie du littéral de chaîne. 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, j'appelle 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. .

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3