7
votes

C ++: la structure sera-t-elle copiée correctement?

J'ai un pointeur à une structure et j'ai besoin de mettre en œuvre une méthode qui copiera tout le contenu de la mémoire d'une structure. Généralement, je dois effectuer une copie profonde d'une structure.

Voici la structure: p> xxx pré>

et voici la méthode que j'ai mise en œuvre qui devrait copier la structure:

...
pSpriteToReturn->vertices = (Vector2f*)malloc( sizeof(arraysize) );
memcpy(pSpriteToReturn->vertices, copyFromMe->vertices, sizeof(arraysize) );
...


4 commentaires

Ça dépend. Si une copie soit une copie profonde, avec des sommets indépendants et * Vertex_indices, ou les deux copies partagent-elles une copie unique des données? Comme actuellement écrit, votre copypeprite ne copiera que les indicateurs et ils partageront des données communes.


Je ne sais pas pourquoi vous avez marqué ce C ++ lorsque tout votre code est droit C.


Si le problème est C., il fait correctement une copie peu profonde. Si le problème est C ++, nous ouvrons toute une boîte de vers qui ne peut pas être répondue car il n'y a pas assez d'informations.


Êtes-vous seul responsable de l'allocation / libérant vos tampons de sommet? OpenGL a-t-il un rôle dans la gestion de cette mémoire? Certaines bibliothèques vous obligent à utiliser leurs routines d'allocation / libre pour gérer la mémoire d'objets de bibliothèque.


7 Réponses :


3
votes

Cela dépend en partie de vos besoins. Si vous ne copiez pas les tableaux, les deux structures pointeront vers le même tableau, qui peuvent ou non être un problème.


0 commentaires

3
votes

Votre schéma va copier les adresses des tableaux. La "copie" TSPRITE renvoyée va avoir des pointeurs sur les mêmes données (en mémoire) que le passage de l'une.

Si vous souhaitez une copie approfondie, vous devrez copier manuellement les tableaux (et tous les membres de leurs éléments).


0 commentaires

8
votes

En règle générale, n'utilisez jamais memcpy en C ++ en code normal (it peut atteindre dans un code très bas de niveau, par exemple dans les allocateurs) 1) . Au lieu de cela, créez un constructeur de copie approprié et une surcharge opérateur = (l'opérateur d'affectation) pour la correspondre ( et un destructeur - règle de trois: "Si vous implémentez l'un ou l'autre de la copie du constructeur de copie , opérateur = et destructeur, vous doit implémenter les trois).

Si vous n'ayez pas implémenté vos propres versions du constructeur de copie, l'opérateur d'affectation, C ++ créera des versions par défaut pour vous. Ces versions implémenteront une copie peu profonde (beaucoup comme ce que memcpy ferait), c'est-à-dire que, dans votre cas, le contenu de la matrice pas est copié - seuls les pointeurs.


1) Incidemment, il en va de même pour MALLOC et gratuit . Ne les utilisez pas, utilisez plutôt Nouveau / Nouveau [] et Supprimer / Suppr [] .


4 commentaires

Merci, mais qu'en est-il de la copie de tableaux de style C? Comment puis-je les copier sans utiliser memcpy?


Utilisez de nouvelles [] pour allouer, STD :: Copie à copier, Supprimer [] à supprimer


@Ila: vous pouvez utiliser std :: copier . Encore une fois, avez-vous vraiment besoin d'utiliser des tableaux de style C de toute façon ou pourraient std :: vecteur ne pas être une meilleure solution?


N'utilisez pas Nouveau [] / Supprimer [] non plus. Il suffit d'utiliser un std :: vecteur et utilisez et de vecteur [0] pour obtenir un tableau de style C.



2
votes

Si c'est C ++, vous écrivez, rappelez-vous que C ++ a nouveau et Supprimer pour une raison. Quant à la question elle-même, cela dépend si vous souhaitez copier des pointeurs ou des structures elles-mêmes. Si ce dernier, vous devez les copier aussi!


2 commentaires

Que pensez-vous que l'auteur écrit en C ++?


@Dash: c ++ balise dans la question? ;>



1
votes

Ce n'est pas une bonne façon de copier même si vous travaillez dans la plaine C.

a signalé dans l'autre réponse, vous vous retrouverez avec deux (ou plus) instances de structure pointant vers les mêmes vertext2 et glubyte instance non recommandée.

Cela conduirait à des problèmes tels que qui libérerait la mémoire allouer à verext2 glubyte

dois-je copier les tableaux après avoir copié la structure? Ou est-ce suffisant pour copier la structure?

Oui c'est la bonne façon de le faire


0 commentaires

1
votes

Les pointeurs eux-mêmes seront copiés, mais cela signifie que "de" et "à" sera la même dans les deux sprites. Vous aurez également besoin d'allouer manuellement et de copier les choses pointées par les pointeurs, mais cela implique que vous devez également savoir à quel point les matrices sont référencées par les pointeurs.

Notez qu'au lieu de memcpy up là-bas, vous pouvez également faire "* pspritretoreturn = * copyfromme;" Cela copiera tous les membres, bien que si vous effectuez de nouvelles matrices, la seule partie des TSprites que vous souhaitez réellement copier est la taille.

Une autre note serait que si vos sprites ont toujours un nombre fixe de sommets et indices de Vert, vous pouvez faire des tableaux à l'intérieur du sprite plutôt que des pointeurs. Si vous l'avez fait, ils seraient alors copiés correctement avec la méthode MEMCY et l'affectation que je mentionnerai dans le paragraphe ci-dessus.


0 commentaires

1
votes

en C ++ Nouveau et Supprimer Allocate sur le tas.

Sprite *ptr =...;
Sprite *s = new Stripe(*ptr); // copy constructor, shallow copy off pointers
s->member = new Member(*ptr->member); // copy construct sprite member

s->array = new int[4]; //allocate array
std::copy(ptr-> array, ptr->array + 4, s->array); //copy array
delete[] s->array; //delete array, must use delete[]


0 commentaires