C ++ delete [] ile yapı dizisini silme
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
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
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.