2016-04-18 8 views
1

Seht jemand etwas offen mit meiner Erweiterungsfunktion unten falsch? Ich habe den privaten Teil der Klasse und meine vertex_node Struktur eingeschlossen, um einen Kontext zu geben. Ich bin mir nicht sicher, warum es nicht richtig expandiert. Jede Hilfe wäre willkommen.Erweitern Funktion ist nicht richtig für meine Grafik erweitern

private: 

//list is pointers to vertex nodes; 

struct vertex_node { 
      string name; 
      set <string> edges; 
}; 

vertex_node **list; 

void Graph:: expand() 
{ 

    int new_cap = capacity * 2+1; 
    //creates new larger array 
    vertex_node **larger_array = new vertex_node*[new_cap]; 

    //loop through all elements of old array 
    for(int i = 0; i<capacity; i++){ 
     if(list[i] != NULL){ 

     //rehash each element and place it in new array 
     int a = hash_string(list[i]->name) % new_cap; 

     larger_array[a]   = new vertex_node; 
     larger_array[a]->name = list[i] -> name; 
     larger_array[a]->edges = list[i] -> edges; 
    } 

    //delete old list 
    delete[] list; 
    list = larger_array; 
    capacity = new_cap; 
    } 
} 
+0

Was ist "Kapazität" und wie wird es initialisiert? Können Sie bitte versuchen, ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen und uns zu zeigen? –

+2

'delete [] list' wird beim iterieren von' i' durch jedes Element von 'list' ausgeführt, nach jeder Iteration wird es auch larger_array zugewiesen, wodurch die nächste Iteration gelöscht wird. Aber vielleicht wurde der echte Code nicht richtig kopiert. –

+1

Übrigens, wenn Sie den Speicher 'new' zuweisen, wird es nicht initialisiert, wenn es einen Standardkonstruktor gibt, wird es aufgerufen, aber Zeiger und andere native Typen (wie zB' int' oder 'double') haben keinen Standard Konstrukteur. Das bedeutet, dass die Zeiger in dem Array, das Sie zuweisen, * unbestimmte * Werte haben und Ihnen * undefiniertes Verhalten * geben, wenn Sie den Haken 'liste [i]! = NULL 'haben. Ich empfehle Ihnen, z.B. 'new vertex_node * [new_cap] (nullptr)' um alle Zeiger auf einen Nullzeiger zu initialisieren. Und machen Sie das gleiche für die anfängliche Zuweisung. –

Antwort

1

Wie ich bereits in meinem Kommentar erwähnt habe, annullieren Sie das ganze Array am Ende der 1. Iteration. Ihr Versuch, ein Speicherleck zu vermeiden, ist lobenswert, aber es muss an zwei Stellen gemacht werden.