2016-05-22 13 views
-3

Ich versuche, ein Array von Zeigern zu einer Struktur zuzuordnen, aber etwas stimmt nicht mit meinem Code.Fehler beim Zuordnen eines Arrays von Zeigern zu einer Struktur

Das ist mein struct:

struct Brick { 
    GameObject2D* handle_; 
}; 

Brick** bricks_; 

Und das ist, wie ich versuche, es zu verteilen Speicher:

int bricks_amount_ = 10;  

bricks_ = (Brick**)malloc(sizeof(Brick*) * bricks_amount_); 

Das Programm zum Absturz bringen. Ich habe eine devenv darauf zu debuggen, wo das Problem ist und es auf dieser Linie abstürzen:

for (unsigned short int i = 0; i < bricks_amount_; i++){ 
    bricks_[i]->handle_ = new GameObject2D(); <---------- CRASH! 
} 

Irgendwelche Vorschläge?

PS: Sorry für mein Englisch: P

================================ ======================================

[LÖSUNG]

Schließlich habe ich beschlossen, std :: vector statt roh Zeiger zu verwenden:

bricks_.resize(bricks_amount_); 

, aber ich habe versucht, die malloc andere Art und Weise zu machen, und es funktioniert auch:

bricks_ = (struct Brick*)malloc(sizeof(struct Brick) * bricks_amount_); 

oder dies:

bricks_ = new Brick[bricks_amount_]; 

Danke den Leuten, die helfen will!

+2

Klar 'bricks_ ohne Absturz tun [i] -> handle_' greift auf nicht initialisierten Speicher zu. 'bricks_ [i]' wurde kein Wert zugewiesen. –

+1

Mischen Sie auch nicht 'malloc()' und 'new()', verwenden Sie 'new []' zum Zuweisen von Arrays. –

+0

Zusätzliche Erklärung zu @KerrekSB 'Kommentar (+1): malloc erstellt ein brauchbares Array, aber der Inhalt ist nicht initialisiert, was bedeutet, dass Ihre Brick * -Zeiger alle einen völlig zufälligen Wert haben, möglicherweise null und möglicherweise über die Sterne hinauszeigend. Was du verpasst hast, war 'game_state_.bricks_ [i] = new Brick();', e. G. kurz vor dem Absturz, um jeden Zeiger innerhalb des Arrays zu initialisieren. – Aconcagua

Antwort

0

Es ist C++:

  • malloc nicht verwenden, verwenden new
  • keine reine Arrays verwenden, verwenden std::vector oder std::array
  • rohen Zeiger nicht verwenden, verwenden std::unique_ptr
+3

Gute Punkte, aber nicht die Lösung für das eigentliche Problem ... – Aconcagua

+1

So etwas wie: bricks_ = neuer Brick [bricks_amount_]; – tonimarquez84

-1

Nicht verwenden

Bricks ** //will be a 2 dimensional array 

Verwenden statt

Bricks * //will be a 1 dimensioanal array 

Wenn Sie ein eindimensionales Array

wollen

Dann tun

`Bricks * bricks_ = (Bricks *)malloc(sizeof(Brick) * bricks_amount_); 

` 

Dann können Sie sicher

for (unsigned short int i = 0; i < bricks_amount_; i++){ 


bricks_[i]->handle_ = new GameObject2D(); <---------- There will not be CRASH! 
} 
+1

Das ist nicht korrekt - mit malloc erhalten Sie immer noch ein unitialisiertes Array (das über den Platzierungskonstruktor initialisiert werden muss!). Außerdem müssen Sie auf diese Weise 'bricks [i] .handle_' verwenden. – Aconcagua

+0

Yup @ Aconcagua Sie sind richtig, Dies sind noch unitialized Zeiger, aber wenn die Struktur nur 1 Zeiger enthält und diese werden mit neuen im nächsten Schritt alloacted, dann ist es in Ordnung. –

+1

Dennoch haben Sie den Konstruktor umgangen (denken Sie daran, das ist C++), und wenn sich die Brick-Klasse ändert (genauer: empfängt nicht POD-Mitglieder), könnten Sie in Schwierigkeiten geraten (OK, Sie können immer noch die entsprechenden Platzierungskonstruktoren für jedes Mitglied aufrufen) vom Typ :: std :: string, :: std :: vector oder was auch immer andere Klasse :: myNamespace :: MyClass wird verwendet - und ändern Sie Ihre Schleife jedes Mal, wenn sich die Brick-Klasse ändert. – Aconcagua

Verwandte Themen