C ++ Array von Strukturen mit delete [] löschen
Ich habe Probleme beim Hinzufügen von Strukturen zum Array in cpp. Ich habe mir diese Methode ausgedacht, die bei Ints hervorragend funktioniert, aber wenn ich das Gleiche bei Strukturen tun möchte, erhalte ich Fehler, nachdem ich 3 oder mehr hinzugefügt habe. Ich habe es ein wenig getestet und es scheint, dass delete [] die Fehlermeldung "Segmentierungsfehler (Core Dumped)" verursacht. Ich kann keine Vektoren oder Listen von stl verwenden, also schlage nicht vor, dass hier ein Code ist:
struct sth
{
unsigned int id;
std::string name;
};
unsigned int id_counter = 0;
unsigned int counter_int = 0;
sth *array = new sth[0];
void print_array()
{
for (int i = 0; i < counter_int; ++i)
{
std::cout << array[i].id << ' ' << array[i].name << " -- ";
}
std::cout << '\n';
}
void add_sth(sth value)
{
sth *newArr = new sth[counter_int + 1];
memcpy(newArr, array, counter_int * sizeof(sth));
delete[] array;
array = newArr;
array[counter_int] = value;
++id_counter;
++counter_int;
}
int main(int argc, char const *argv[])
{
sth e1 = {1, "abc1"};
sth e2 = {2, "abc2"};
add_sth(e1);
add_sth(e2);
add_sth(e2);
print_array();
}
Antworten
Das Problem ist wahrscheinlich, dass versucht wird, eine std::stringmit memcpy zu kopieren .
std::string ist kein POD-Objekt (Plain Old Data), und einige Compiler und sicherlich statische Code-Analysatoren, z. B. SonarQube oder Klocwork, werden Sie darauf hinweisen, dass das, was Sie tun, falsch ist.
Um eine Kopie korrekt durchzuführen, sollten Sie einen Zuweisungsoperator definieren und die Elemente einzeln kopieren oder einfach einen dynamischen Container verwenden, z std::vector
Die sthStruktur hat ein std::stringMitglied, daher memcpyfunktioniert die Verwendung nicht richtig, da sie sthnicht trivial kopierbar ist. Die memcpyFunktion weiß nichts über C ++ - oder C ++ - Klassen, die Nicht-POD-Mitglieder enthalten.
In C ++ können Sie ersetzen memcpymit std :: copy :
#include <algorithm>
//...
std::copy(array, array + counter_int, newArr);
Ein guter C ++ - Compiler wandelt das std::copyin um, memcpywenn er feststellt, dass die Typen trivial kopierbar sind. Andernfalls kopiert der Compiler die Objekte einfach mit einer Schleife.