C ++ Eliminazione di array di strutture con delete []

Oct 25 2020

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

3 BarakFriedman Oct 25 2020 at 16:38

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

2 PaulMcKenzie Oct 25 2020 at 16:43

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.