C ++ delete [] ile yapı dizisini silme

Oct 25 2020

Cpp'de diziye yapı eklemekte sorun yaşıyorum. İnts üzerinde harika çalışan bu yöntemi buldum ama aynı şeyi yapılar üzerinde yapmak istediğimde 3 veya daha fazlasını ekledikten sonra hata alıyorum. Biraz hata ayıkladım ve [] silme işleminin "Segmentasyon hatası (çekirdek döküldü)" hata mesajına neden olduğu görülüyor. Stl'deki vektörleri veya listeyi kullanamıyorum, bu yüzden şunu önermeyin İşte bazı kodlar:

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

Yanıtlar

3 BarakFriedman Oct 25 2020 at 16:38

Sorun muhtemelen std::stringmemcpy ile kopyalamaya çalışıyor .

std::string bir POD (Düz Eski Veriler) nesnesi değildir ve bazı derleyiciler ve kesinlikle statik kod çözümleyicileri, örneğin SonarQube veya Klocwork, yaptığınız şeyin yanlış olduğu konusunda sizi uyaracaktır.

Bir kopyayı doğru şekilde gerçekleştirmek için bir atama operatörü tanımlamalı ve öğeleri tek tek kopyalamalısınız veya sadece dinamik bir kap kullanmalısınız, örn. std::vector

2 PaulMcKenzie Oct 25 2020 at 16:43

Yapının sthbir std::stringüyesi var, bu nedenle , önemsiz kopyalanabilir olmadığından kullanımı memcpydüzgün çalışmayacaktır sth. memcpyFonksiyonu C ++ veya POD olmayan üyeleri içeren C ++ sınıfları hakkında hiçbir şey bilmiyor.

C ++ ' memcpyda std :: copy ile değiştirebilirsiniz :

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

İyi bir C ++ derleyicisi değiştirecek std::copykadar memcpyo tipleri trivially-copyable olduğunu algılarsa. Aksi takdirde, derleyici nesneleri bir döngü kullanarak kopyalayacaktır.