Zmiana rozmiaru tablicy w trakcie działania programu

0

Witam,
Piszę obecnie program, który wczyta dane dowolnej liczby osób, a potem na żądania uzytkownika je wyswietli.
Mam problem ze zmianą rozmiaru tablicy, tak aby mozna było zapisać dowolną ilość danych (po uruchomieniu w pewnym momencie pojawia się: terminate called after throwing an instance of 'std::bad_alloc'what(): std::bad_alloc)

Mój kod:

#include <iostream>

using namespace std;

struct Dane
{
    string imie;//docelowo ma być więcej danych (nazwisko, wiek itp), stąd struktura.
};

Dane *zwieksz_ksiazke(Dane *ksiazka, int *rozmiar)//podwaja rozmiar tablicy
{
    *rozmiar= (*rozmiar)*2;
    Dane *nowa_ksiazka=new Dane[*rozmiar];
    for(int i=0;i< *rozmiar;i++)
    {
        nowa_ksiazka[i]=ksiazka[i];
    }
    delete[]ksiazka;
    return nowa_ksiazka;
}

Dane wczytaj_pozycje(Dane &pozycja,int nr_pozycji)
{
    cout<<"podaj imie nr: "<<nr_pozycji<<" \n";
    cin>>pozycja.imie;
    return pozycja;
}

void wczytaj_ksiazke(Dane *ksiazka,int *rozmiar)//wczytuje imiona dopóki uzytkownik nie wybierze 0.
{
    int wybor=1;
    int nr_pozycji=1;
    while(wybor!=0)
    {
        if(nr_pozycji<=*rozmiar)
        {
            wczytaj_pozycje(ksiazka[nr_pozycji-1],nr_pozycji);
            nr_pozycji++;
            cout<<"wybierz 1 dla dalszego wczytywania, 0 aby zakonczyc: ";
/*po wyborze 1 pojawia się w konsoli komunikat:terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc*/
            cin>>wybor;
        }
        else
        {
            ksiazka=zwieksz_ksiazke(ksiazka,rozmiar);
        }
    }
    cout<<"zakonczono";
}

int main()
{
    int rozmiar=1;
    Dane *ksiazka=new Dane[rozmiar];
    wczytaj_ksiazke(ksiazka,&rozmiar);
    return 0;
}

Z góry dzięki za pomoc!

4

Jezeli nie musisz korzystac z tablic to prosi sie o uzycie vectora.
http://cpp0x.pl/kursy/Kurs-STL-C++/Kontener-tablicy-std-vector/119
https://en.cppreference.com/w/cpp/container/vector

Polecam takze wpis KrzaQ, ktory pozwoli Ci poznac temat.
https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

1

Pomijając już powyższe:

Dane *zwieksz_ksiazke(Dane *ksiazka, int *rozmiar)//podwaja rozmiar tablicy
{
    *rozmiar= (*rozmiar)*2;
    Dane *nowa_ksiazka=new Dane[*rozmiar];
    for(int i=0;i< *rozmiar;i++)
    {
        nowa_ksiazka[i]=ksiazka[i];
    }
    delete[]ksiazka;
    return nowa_ksiazka;
}
 

Po co wprowadzasz rozmiar tablicy przez wskaźnik?
W pętli wychodzisz poza zakres ksiazka - dajmy na to, że rozmiar miał wartość 5 na wejściu do funkcji. Więc zapewne rozmiar ksiazka ma indeksy od 0 do 4. Zwiększasz rozmiar, a potem odwołujesz się do wartości spoza tablicy.
Robienie delete[] na argumencie funkcji to też nie najlepszy pomysł.

0

Dzięki wielkie za pomoc!
Dopiero zaczynam naukę C++ i nie znam jeszcze wektorów, ale postaram się to szybko nadrobić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1