2010-09-06 4 views
1

Je suis curieux de la façon dont les données sont traitées dans la situation:A propos de C++ pointeurs

chapterlist.clear(); 
cScene newscene; 
newscene.name = "Laura does something."; 
newscene.words = 432; 
newscene.pov = "Laura"; 
cChapter newchapter; 
newchapter.scenelist.push_back(newscene); 
chapterlist.push_back(newchapter); 

chapterlist est un vecteur cChapter.

Je crée un nouvel objet cScene, et je le pousse sur le vecteur scénariste d'un nouvel objet cChapter, que j'appuie ensuite sur la liste de chapitres. Ma question est la suivante: lorsque je pousse des objets sur un vecteur, toutes les données sont-elles dupliquées dans le vecteur, alors que les anciennes données sont détruites de la pile à la fin de la portée?

Ou est quelque chose d'autre qui se passe ??? PS: Je déteste les pointeurs, comme le font beaucoup.

+5

Je suis plus moi-même la personne du Labrador, mais * haïr * les pointeurs? – Anycorn

+3

Je déteste seulement les pointeurs * far *. Est-ce que ça fait de moi un xénophobe? – Shog9

Répondre

3

Boost C++ norme précise dans le chapitre 23, bibliothèque conteneurs que a.push_back(x) a la a.insert(a.end(), x) sémantique opérationnelle . Il est en outre indiqué que a.insert(p, t) insère une copie de t avant p.

Alors oui, une copie est insérée dans le vecteur.

5

Lorsque vous poussez quelque chose dans un vecteur, l'objet est copié à l'aide d'un constructeur de copie. La durée de vie initiale de l'objet sera complètement déconnectée de la durée de vie de l'objet construit à l'intérieur du vecteur.

1

Et lorsque vous copiez un objet contenant un vecteur, le vecteur est entièrement copié.

4

Ma question est: quand je poussais des objets sur un vecteur, est toutes les données étant dupliqués dans le vecteur, tandis que les anciennes données sont détruites à partir la pile lorsque le champ d'application se termine?

Oui.

PS: Je déteste les pointeurs, comme beaucoup

bien essayer de ne pas trop, la mémoire est juste un énorme tableau d'octets :) Pointeurs ne sont que des index dans ce tableau énorme. Lorsque vous obtenez votre tête autour d'eux, vous riez à quel point ils sont simples :)

2

En supposant que vous avez quelque chose comme

struct cScene {...}; 
struct cChapter { 
    std::vector<cScene> scenelist; 
} 

alors pas de pointeurs sont impliqués à tous, et les entrées sont hissés sur le scenelist sera copié , chaque élément de la scène sera détruit quand cChapter est.

Si vous aviez

struct cChapter { 
    std::vector<cScene*> scenelist; 
} 

et utilisé

cScene * newscene = new cScene; 
newchapter.scenelist.push_back(newscene); 

le pointeur est copié, vous avez maintenant deux pointeurs séparés au même emplacement mémoire, avec toute la gestion de la vie cela implique. Si les éléments de cScene sont grandes et vous ne voulez pas les frais généraux de copie de std :: vecteur, ont un oeil à smart pointers

+0

cScene et cChapter sont des classes et non des structures. Cela change-t-il quelque chose? –

+2

@Alexander Non, 'struct foo {...};' est entièrement équivalent à la classe 'foo {public: ...};'. –

1

La réponse à votre question est oui: Les données d'origine seront copiées dans une nouvelle structure à l'intérieur du vecteur et seront ensuite détruites à la fin de la pile.

Mais ne vous inquiétez pas trop. Ici, vous utilisez une structure plutôt mince: deux pointeurs char et un entier. Vous devriez bien le copier.