2010-11-29 11 views
0

Got kleines Problem hier.mögliche Probleme nach der Größenanpassung dynamische Array

I erstellt dynamisches Array:

m_elements = new struct element*[m_number_of_elements]; 
    for(int i = 0; i < m_number_of_elements; i++) 
    { 
     m_elements[i] = new struct element[m_element_size]; 
    } 

dann habe ich versucht, bestehende Array, um die Größe:

m_elements[m_number_of_elements] = create_more_elements(); 
    m_number_of_elements++; 

create_more_elements() ist eine Funktion:

struct index* create_more_elements() 
    { 
     struct element* tmp = new struct element[m_number_of_elements] 
     return tmp; 
    } 

Im allgemeinen ist dieses Stück der Code funktioniert, aber manchmal bekomme ich an verschiedenen Stellen segfaults. Sind segfaults mit der Größenanpassung verbunden? Irgendwelche Gedanken?

Antwort

4

Sie sollten std::vector dafür verwenden, dann können Sie mit new Speicher für neue struct zuweisen und ihren Zeiger auf Vektor, wenn Sie löschen sollten Sie auf Zeiger löschen.

+0

Ich stimme dir zu, aber ich habe etwa 1000 Zeilen Code und ich hoffe, nicht alles zu ändern))). – qutron

+0

Dies löst die Array-Behandlung, aber nicht die Speicherbehandlung der tatsächlichen Strukturen. Da das OP anscheinend von C kommt, ist es ein guter Rat, zu versuchen und aufzuhören, alles mit "neu" zuzuteilen, nur weil du es kannst. Die meiste Zeit ist 'vector ' eine bessere Idee als 'vector '. – Mephane

+1

@qutron: Es ist besser, jetzt bei 1000 Zeilen zu ändern, als bei 10000 Zeilen herauszufinden, dass Sie von Anfang an einen Vektor hätten verwenden sollen. ;) – Mephane

0
m_elements[i] = new struct element[m_element_size]; 

Dies schafft eine Reihe von element der Größe m_element_size

Um dynamisch eine Struktur zu erstellen, nur new struct element oder new element verwenden.

Wenn müssen keine Werte im Array initialisieren, Sie noch besser keine Zeiger zu speichern sein, aber tatsächlich Objekte im Array:

m_elements = new element[m_number_of_elements]; 

Um „die Größe“ ein Array, Sie haben tatsächlich zuweisen ein neues größeres Array, kopiere den Inhalt des aktuellen Arrays in das neue und lösche das alte Array.

// Allocate new array 
element* newArray = new element[m_number_of_elements + 1]; 
// Copy old array content into new one 
memcpy(newArray, m_elements, m_number_of_elements * sizeof(element)]; 
// Delete old array 
delete[] m_elements; 
// Assign new array 
m_elements = newArray; 
// Keep new size 
m_number_of_elements += 1; 

Aber Sie sollten auf jeden Fall std::vector benutzen, die als einfacher und intelligenter ist:

std::vector<element> elements; 

// Add an element 
Element element; 
... 
elements.push_back(element); 
1

Versuchen Sie folgendes:

std::vector<element> m_elements; 
m_elements.resize(m_number_of_elements); 

nicht die Route zur Herstellung eines Arrays Gehen Sie manuell verwalten, es sei denn absolut notwendig - std::vector wird einen viel besseren Job machen, ist besser getestet, bewährt, standardisiert und von Legionen von C++ - Programmierer verstanden. Siehe mein Codebeispiel - nicht einmal eine einzige new oder -Anweisung, aber dieser Code enthält auch alle erforderlichen Speicherverwaltung.

S.S .: Da diese Frage als C++ markiert ist, müssen Sie nicht schreiben struct element wo immer Sie es als ein Typ verwenden, nur element wird ausreichen. Dies deutet darauf hin, dass Sie von C kommen, also mein Rat: Erfahren Sie mehr über die STL, bevor Sie fortfahren, was Sie tun. Eine einzige Stunde, in der Sie lernen, wie Sie die Standard-Container-Klassen verwenden, erspart Ihnen viele Tage des manuellen Optimierens, Debuggens und Fehlers. Festsetzung. Vor allem, wenn man einmal etwas gelernt hat, weiß man schon 80% von allen anderen. :)

0

Es ist ein Wunder, dass Sie Code sogar funktioniert. Im Grunde überschreiben Sie den Speicher nach dem ursprünglich zugewiesenen Array. In C++ können Sie die Größe des Arrays nicht ändern, Sie können es nur löschen und ein neues erstellen.

element** tmp = new element*[m_number_of_elements]; 
for(int i = 0; i < m_number_of_elements; i++) 
{ 
    tmp[i] = m_elements[i] 
} 
delete m_elements; 
m_elements = tmp; 

m_elements[m_number_of_elements] = create_more_elements();  
m_number_of_elements++; 

Aber das ist wirklich grausam. Wie Svisstack betont, sollten Sie std :: vector oder einen anderen geeigneten Standardcontainer verwenden.

std::vector<element*> m_elements; 

// ... 

m_elements.push_back(create_more_elements()); 
Verwandte Themen