C ++: Wird die Struktur korrekt kopiert?

7

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.

    
Ilya Suzdalnitski 21.01.2010, 19:46
quelle

7 Antworten

8

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[] .

    
Konrad Rudolph 21.01.2010, 19:51
quelle
3

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.

    
Brian Young 21.01.2010 19:49
quelle
3

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.

    
Kevin Montrose 21.01.2010 19:50
quelle
2

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!

    
Kornel Kisielewicz 21.01.2010 19:52
quelle
1

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

zugewiesen wurde

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

    
Yogesh Arora 21.01.2010 19:57
quelle
1

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.

    
dash-tom-bang 21.01.2010 19:58
quelle
1

in C ++ neu und lösche allokieren auf Heap.

%Vor%     
Anycorn 21.01.2010 20:03
quelle

Tags und Links