C ++ Eliminazione di array di strutture con delete []
Ho problemi con l'aggiunta di strutture all'array in cpp. Ho escogitato questo metodo che funziona alla grande sugli int, ma quando voglio fare la stessa cosa sulle strutture ottengo un errore dopo aver aggiunto 3 o più. Ho eseguito il debug un po 'e sembra che delete [] stia causando il messaggio di errore "Segmentation fault (core dumped)". Non posso usare vettori o elenchi da stl, quindi non suggerire che Ecco un codice:
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();
}
Risposte
Il problema probabilmente sta provando a copiare un std::stringcon memcpy.
std::string non è un oggetto POD (Plain Old Data) e alcuni compilatori e certamente analizzatori di codice statico, ad esempio SonarQube o Klocwork, ti avviseranno che ciò che stai facendo è sbagliato.
Per eseguire correttamente una copia è necessario definire un operatore di assegnazione e copiare gli elementi uno per uno, oppure utilizzare semplicemente un contenitore dinamico, ad es. std::vector
La sthstruttura ha un std::stringmembro, quindi l'utilizzo memcpynon funzionerà correttamente a causa del fatto che sthnon può essere facilmente copiato. La memcpyfunzione non sa nulla delle classi C ++ o C ++ che contengono membri non POD.
In C ++, puoi sostituire memcpycon std :: copy :
#include <algorithm>
//...
std::copy(array, array + counter_int, newArr);
Un buon compilatore C ++ trasformerà il std::copyin memcpyse rileva che i tipi sono facilmente copiabili. Altrimenti il compilatore copierà semplicemente gli oggetti usando un ciclo.