C ++ Suppression d'un tableau de structures avec delete []

Oct 25 2020

J'ai du mal à ajouter des structures au tableau dans cpp. J'ai mis au point cette méthode qui fonctionne très bien sur les ints, mais lorsque je veux faire la même chose sur des structures, j'obtiens une erreur après avoir ajouté 3 ou plus. Je l'ai un peu débogué et il semble que delete [] provoque le message d'erreur "Segmentation fault (core dumped)". Je ne peux pas utiliser de vecteurs ou de liste de stl, alors ne suggérez pas que Voici un code:

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();
}

Réponses

3 BarakFriedman Oct 25 2020 at 16:38

Le problème est probablement d'essayer de copier un std::stringavec memcpy.

std::string n'est pas un objet POD (Plain Old Data), et certains compilateurs et certainement des analyseurs de code statiques comme SonarQube ou Klocwork vous avertiront que ce que vous faites est mal.

Pour réaliser une copie correctement, vous devez définir un opérateur d'affectation et copier les éléments un par un, ou simplement utiliser un conteneur dynamique, par exemple std::vector

2 PaulMcKenzie Oct 25 2020 at 16:43

La sthstructure a un std::stringmembre, donc l'utilisation memcpyne fonctionnera pas correctement car elle sthn'est pas trivialement copiable. La memcpyfonction ne sait rien des classes C ++ ou C ++ qui contiennent des membres non POD.

En C ++, vous pouvez remplacer memcpypar std :: copy :

#include <algorithm>
//...
std::copy(array, array + counter_int, newArr);

Un bon compilateur C ++ transformera le std::copyen memcpys'il détecte que les types sont facilement copiables. Sinon, le compilateur copiera simplement les objets en utilisant une boucle.