2009-10-04 7 views
1

Écrire un pointeur sur une chaîne, supprimer un pointeur et charger un pointeur à partir d'une chaîne?Est-il possible? (C++)

+2

Pourquoi cela ne serait-il pas possible? – Zed

+3

Vous devriez expliquer votre question un peu plus. Que voulez-vous dire par "supprimer le pointeur", par exemple? – sellibitze

Répondre

14

Il est possible de faire ces opérations, mais elles n'auront pas l'effet que vous avez (probablement) après.

L'écriture du pointeur sur une chaîne stockera uniquement la valeur du pointeur, c'est-à-dire l'adresse de l'objet pointé. C'est une chaîne de longueur plus ou moins constante, comme 0x7f2b93c91780 (sur un système 64 bits). Naturellement, cela ne capture pas l'état de l'objet réel. Lorsque vous utilisez delete sur le pointeur, la mémoire pointée sera retournée au système; ce n'est plus à vous d'utiliser. Le pointeur lui-même n'est pas supprimé, l'opération n'affecte que la mémoire pointée. En outre, la valeur du pointeur ne change pas réellement lorsque vous utilisez delete dessus. Ainsi, il n'y a pas de différence si vous le rechargez maintenant en le lisant depuis une chaîne stockée ailleurs: il pointe toujours sur la mémoire que vous ne possédez plus et ne peut donc pas lire ou écrire sans invoquer undefined behavior. Comme l'a suggéré PiotrLegnica, vous devez sérialiser l'objet entier dans une chaîne, puis recréer l'objet à partir de la version sérialisée (désérialiser).

+0

En fait, quand vous dites 'delete ptr', vous ne supprimez pas le pointeur, mais la valeur vers laquelle il pointe. L'objet pointeur lui-même n'est supprimé que lorsqu'il est hors de portée. Donc "supprimer un pointeur" (habituellement) n'est pas un terme correct. A part ça, je suis totalement d'accord avec votre réponse. +1 – sbi

+0

@sbi: Je suppose que je suis aveuglé par les points communs, je pense vraiment et je dis "efface le pointeur", bien que je sache bien que le pointeur n'est pas ce qui est supprimé ... J'ai essayé d'être plus précis . – unwind

+0

@unwind: C'était simplement un point mineur. (Bien que je pense que le fait d'être précis aide souvent, surtout quand on répond aux questions des débutants qui ont évidemment des problèmes à se passer la tête autour des pointeurs ...) – sbi

7

C'est possible, mais ça ne fera pas ce que vous pensez qu'il va faire. La sauvegarde d'un objet entier sous forme de chaîne est appelée sérialisation - voir Boost.Serialization (ou Protocol Buffers, comme suggéré dans les commentaires) si vous en avez besoin.

+1

Préférez si possible les tampons de protocole Google: http://code.google.com/intl/fr/apis/protocolbuffers/docs/overview.html, il est préférable de décorréler la structure de sérialisation/désérialisation de l'objet lui-même pour avancer/reculer compatibilité. –

Questions connexes