Comment les expressions de chaîne dans C ++ fonctionnent-elles?
considéger: p> où et comment est l'expression "hey" stockée et pourquoi est-ce une défaut de segmentation quand je tente Pour la supprimer? p> p>
9 Réponses :
Vous ne pouvez pas supprimer les ressources statiques: celles-ci sont en lecture seule. P>
où il est stocké est laissé au compilateur pour décider dans cet étui (un peu spécial). Cependant, cela ne compte pas vraiment pour vous - si vous n'allouez pas de mémoire avec Si vous souhaitez contrôler la répartition de cette ressource, vous devez utiliser un nouveau code>, ce n'est pas très agréable d'essayer de le réactiver avec Supprimer code>. Vous ne pouvez pas Supprimer la mémoire code> alloué dans la manière dont vous l'avez alloué. P>
std :: string code> ou allouer un tampon à l'aide de MALLOC () code>. p>.
Oh ... donc il n'est pas très recommandé d'utiliser des pointeurs sur Cons-Car Data, je suppose
@Pyjong: Vous êtes libre d'utiliser un pointeur pour référence à Const Char Data, n'essayez tout simplement pas de supprimer la mémoire référencée par le pointeur.
@Nick, j'ajouterais aussi que si vous allouez avec MALLOC code>, vous devez également vous assurer de libérer avec gratuit code>.
@Nick Meyer: Bon point. Cela semblait au-delà de la portée de la discussion actuelle .. :-)
Vous ne pouvez pas supprimer des données constantes. Vous feriez seulement appeler Suppr [] TMP code> si vous aviez déjà appelé Nouveau Char [Stringsize] Code>. P>
Lorsque vous affectez un Si vous deviez faire Ne pas constr * code> pointeur sur une chaîne constante comme "hey" code> dans l'exemple, la séquence hey \ 0 code> est stocké comme une variable statique à l'intérieur du binaire lui-même. Il ne peut pas être supprimé et ne doit pas être manipulé. Selon le système d'architecture / d'exploitation, il peut segfault lors de la manipulation em>. P>
const caractère [] TMP = "hey" code>, les données seraient stockées sur la pile et peuvent être manipulées (mais non supprimées, comme il sera libéré une fois que le Stack Efface: lorsque la fonction renvoie). P>
Supprimer [] code> Tout ce qui n'est pas Nouveau [] code> 'd. p>
Vous n'avez pas appelé J'espère que cela aide,
Meilleures salutations,
Tom. P> nouveau code> sur la chaîne. C'est une fuite de mémoire potentielle de toute façon, pour chaque Nouveau code> Il existe un Supprimer code>, de même pour MALLOC code> et gratuit code> . Vous avez supprimé une référence de mémoire à un pointeur que simple est une gamme statique de caractères, au sens du mot. p>
Que se passe-t-il est. P>
Vous pouvez transmettre ce littéral comme tel: "une adresse d'une chaîne". P>
Vous ne pouvez pas le supprimer. P>
Lorsque vous construisez STD :: String ("Hey"), il prend cette chaîne pointue et la copie ailleurs - dans une mémoire nouvellement attribuée. P> "hé" code> signifie mettre de la chaîne "hey" dans une image binaire quelque part et donnez-moi une adresse de celui-ci em>, qui est la valeur de l'expression ("hey") . Il a du type de caractère *. À cette adresse, vous avez 4 octets. 'H', 'E', 'Y', et 0 (0 est appelé Terminator NULL conventionnel. (Rien à voir avec le terminateur de films) C'est la manière dont les littéraux de chaînes fonctionnent dans c. P>
Le de sorte que les données sont effectivement lecture seule em>, et Essayez de le manipuler avec "hey" code> est un littéral à chaîne et est stocké dans le segment de données exécutable em>, qui est mappé dans la mémoire du processus au moment de la charge. La partie particulière dans laquelle les littéraux vivent sont mappés en lecture seule em>. Voici un extrait de l'assemblée produite à partir de votre code avec g ++ -s code>: Supprimer code> conduit à Segfault. P> P>
la chaîne Si vous voulez voir Un programme qui alloue la mémoire, l'utilise, puis le supprime, puis examinez ceci: p> remarque comment je suis arrivé à supprimer le Peu importe que, à la fin, nous indiquons la mémoire "hey" code> a son espace pré-alloué dans le cadre du programme, il apparaît donc simplement lorsque le programme commence et disparaît lorsque le programme se termine. nouveau code> d Mémoire en utilisant TMP code>. J'aurais pu faire ceci: p> nouvelle code> d avec Hey code> ou TMP code>, aussi longtemps que nous le supprimons correctement pour éviter les fuites de mémoire. P> P>
"hey" est stocké dans un Zone en lecture seule du segment de données .
Lorsque l'application démarre "hey" sera mappée sur la page de mémoire en lecture seule. P> changement de valeur en lecture seule n'est pas autorisé, Un défaut de segmentation est donc arrivé . P> p> const char * tmp = "hé"; code> Supprimer code> Accédez et modifie certaines métadonnées d'allocation. ,
Mais "hey" dans la page de mémoire en lecture seule. p>
Ce code est un bug. Vous ne pouvez pas supprimer un littéral.
Je pense que le questionneur comprend que beaucoup, Pavel. La question demande pourquoi i>.