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> 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) );
...
7 Réponses :
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. P>
Votre schéma va copier les adresses des tableaux. La "copie" Si vous souhaitez une copie approfondie, vous devrez copier manuellement les tableaux (et tous les membres de leurs éléments). P> TSPRITE code> renvoyée va avoir des pointeurs sur les mêmes données (en mémoire) que le passage de l'une. P>
En règle générale, n'utilisez jamais 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 code> memcpy code> ferait), c'est-à-dire que, dans votre cas, le contenu de la matrice pas em> est copié - seuls les pointeurs. P>
1) sup> Incidemment, il en va de même pour memcpy code> en C ++ en code normal (it peut em> atteindre dans un code très bas de niveau, par exemple dans les allocateurs) 1) sup>. Au lieu de cela, créez un constructeur de copie approprié et une surcharge
opérateur = code> (l'opérateur d'affectation) pour la correspondre ( et em> un destructeur - règle de trois: "Si vous implémentez l'un ou l'autre de la copie du constructeur de copie ,
opérateur = code> et destructeur, vous doit em> implémenter les trois). P>
MALLOC code> et
gratuit code>. Ne les utilisez pas, utilisez plutôt
Nouveau code> /
Nouveau [] code> et
Supprimer code> /
Suppr [] code>. p>
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 code>. Encore une fois, avez-vous vraiment besoin d'utiliser des tableaux de style C de toute façon ou pourraient
std :: vecteur code> ne pas être une meilleure solution?
N'utilisez pas Nouveau [] code> /
Supprimer [] code> non plus. Il suffit d'utiliser un
std :: vecteur code> et utilisez
et de vecteur [0] code> pour obtenir un tableau de style C.
Si c'est C ++, vous écrivez, rappelez-vous que C ++ a nouveau code> et
Supprimer code> 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! P>
Que pensez-vous que l'auteur écrit en C ++?
@Dash: c ++ balise dans la question? ;>
Ce n'est pas une bonne façon de copier même si vous travaillez dans la plaine C. P>
a signalé dans l'autre réponse, vous vous retrouverez avec deux (ou plus) instances de structure pointant vers les mêmes Cela conduirait à des problèmes tels que qui libérerait la mémoire allouer à Oui c'est la bonne façon de le faire p> vertext2 code> et
glubyte code> instance non recommandée. p>
verext2 code>
glubyte code> p> p>
dois-je copier les tableaux après avoir copié la structure? Ou est-ce suffisant pour copier la structure? Code> p>
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. P>
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. P>
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. P>
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[]
Ç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.