Ich habe einen Zeiger auf eine Struktur und ich muss eine Methode implementieren, die den gesamten Speicherinhalt einer Struktur kopiert. Im Allgemeinen muss ich eine tiefe Kopie einer Struktur durchführen.
Hier ist die Struktur:
%Vor%Und hier ist die Methode, die ich implementiert habe, die die Struktur kopieren sollte:
%Vor%Das Problem ist, dass ich nicht sicher bin, ob die Arrays "vertices" und "vertex_indices" korrekt kopiert werden. Was wird auf diese Weise kopiert? Adresse des Arrays oder des Arrays selbst?
Soll ich die Arrays nach dem Kopieren der Struktur kopieren? Oder genügt es, nur die Struktur zu kopieren?
In etwa so:
%Vor%Vielen Dank im Voraus.
Als Faustregel sollten Sie niemals memcpy
in C ++ in normalem Code verwenden (es könnte in sehr niedrigen Code vorkommen, zB in Zuweisungen) 1) . Erstellen Sie stattdessen einen geeigneten Kopierkonstruktor und überladen Sie operator =
(den Zuweisungsoperator), um ihn anzupassen ( und ein Destruktor - Regel aus drei: "wenn Sie entweder den Kopierkonstruktor operator =
oder den Destruktor implementieren , Sie müssen alle drei implementieren).
Wenn Sie Ihre eigenen Versionen des Kopierkonstruktors und den Zuweisungsoperator nicht implementieren, erstellt C ++ Standardversionen für Sie. Diese Versionen implementieren eine flache Kopie (ähnlich wie memcpy
), d. H. In Ihrem Fall würde der Array-Inhalt nicht kopiert werden - nur die Zeiger.
1) Gleiches gilt übrigens für malloc
und free
. Benutze sie nicht, sondern verwende new
/ new[]
und delete
/ delete[]
.
Dies hängt teilweise von Ihren Anforderungen ab. Wenn Sie die Arrays nicht kopieren, zeigen beide Strukturen auf dasselbe Array, was ein Problem sein kann oder auch nicht.
Ihr Schema wird die Adressen der Arrays kopieren. Die "Kopie" tSprite
zurückgegeben hat Zeiger auf die gleichen Daten (im Speicher) wie die übergebene.
Wenn Sie eine echte Deep-Kopie wünschen, müssen Sie die Arrays (und alle Elemente ihrer Elemente) manuell kopieren.
Wenn Sie C ++ schreiben, denken Sie daran, dass C ++ aus irgendeinem Grund new
und delete
hat. Wie bei der Frage selbst hängt es davon ab, ob Sie Zeiger oder die Strukturen selbst kopieren wollen. Wenn Letzteres, müssen Sie sie auch kopieren!
Dies ist kein richtiger Weg, um zu kopieren, selbst wenn Sie in reinem C arbeiten.
A, auf das in der anderen Antwort hingewiesen wird, erhalten Sie zwei (oder mehr) struct-Instanzen, die auf dieselbe Vertext2
und GLubyte
-Instanz verweisen, was nicht empfohlen wird.
Dies würde zu Problemen führen, wie z. B. wer den Speicher freigibt, der zu Vertext2
GLubyte
Should I copy the arrays after copying the structure? Or is it enough just to copy the structure?
Ja, das ist der richtige Weg, es zu tun
Die Zeiger selbst werden kopiert, aber das bedeutet, dass "von" und "zu" in den beiden Sprites identisch sind. Sie müssen auch manuell die Dinge zuweisen und kopieren, auf die die Zeiger zeigen, aber das bedeutet, dass Sie auch wissen müssen, wie groß die Arrays sind, auf die die Zeiger verweisen.
Beachten Sie, dass Sie anstelle von memcpy dort auch '* pSpriteToReturn = * copyFromMe;' Dadurch werden alle Mitglieder kopiert. Wenn Sie jedoch neue Arrays erstellen, ist der einzige Teil der tSprites, den Sie tatsächlich kopieren möchten, die Größe.
Ein weiterer Hinweis wäre, dass Sie, wenn Ihre Sprites immer eine feste Anzahl von Vertices und Vertex-Indizes haben, diese Arrays im Sprite und nicht in Zeigern erstellen können. Wenn Sie dies tun würden, dann würden sie korrekt mit der memcpy-Methode und der Zuweisung, die ich im obigen Absatz erwähnt habe, kopiert werden.