Zmiana rozmiaru tablicy dynamicznej

0

Witam,
Jak w temacie. Musze zwiększać rozmiar tablicy dynamicznej, Niestety niemoge użyć ani wektora ani listy. Mam do dyspozycji tylko iostream... Wiem ze jako tako nieda sie zwiekszyc rozmiaru tablicy dynamicznej, ale co gdyby usunac stara tablice i w jej miejsce dac nowa? Mam wiec taki kod pogladowy :

#include <iostream>

void zwieksz(int *tab, int &tab_size);

int main()
{
    int tab_size = 1;

    int *tab = new int [tab_size];

    for (int i = 1; i < 10; i++)
    {
        zwieksz(tab,tab_size);
        std::cout<< "udalo sie " << i << "raz \n";
    }

}


void zwieksz(int *tab, int &tab_size)
{
    delete []tab;

    tab_size++;

    tab = new int [tab_size];
}

Niestety przechodzi tylko 6 razy, potem dostaje
*** glibc detected *** ./test_dynamiczna: double free or corruption (fasttop): 0x000000000091a010 ***
Z tego co sie doczytalem próbuje zwolnic coś co już zostalo usunięte ze sterty. Bede wdzieczny za jakąkolwiek pomoc w rozwiązaniu tego problemu.

0

Przekazujesz kopię wskaźnika do tej tablicy. To twoje tab wewnatrz funkcji jest tylko kopią, czyli NOWYM wskaźnikiem. Dziwie się że błąd nie wystąpuje już przy drugiej iteracji.
Ty po prostu kasujesz tą tablicę w funkcji a potem tworzysz nową, ale przypisujesz do INNNEGO wskaźnika, który przy okazji po zakończeniu funkcji znika i masz wyciek pamięci.
Rozwiązanie? Albo & przy tym wskaźniku w deklaracji funkcji, albo zwracanie z funkcji tego wskaźnika.

0

Może teraz wyjde na nieuka ale wskaźnik wkazuje na miejsce w pamieci i na jaki typ danych wskazuje... Co za tym idzie w funkcji operujemy nie na kopii ale orginale. Oczywiscie sprawdziłem czy da sie to zrobić Twoim sposobem ale kompilator nie byl zadowolony ze chce zrobic referencje do wskaznika. Natomiast pomysl zeby funkcja zwrocila wskaznik do tablicy spodobal mi sie, jednak jest to samo co na poczatku. Czytaj wykonuje sie 6 razy. Poprawiony kod. Dodalem zeby dopisywal dane do tablicy zeby byla pewnosc ze dane pozostaja.

#include <iostream>

int* zwieksz(int *tab, int &tab_size);

int main()
{
    int tab_size = 1;

    int *tab = new int [tab_size];

    for (int i = 0; i < 1000; i++)
    {
        tab[i] = i;
        
        tab = zwieksz(tab,tab_size);
        
        std::cout<<"udalo sie "<<i<<"raz \n";


            for (int i = 0; i < tab_size-1; i++)
            {
                std::cout<<tab[i]<<" ";
            }
            std::cout<<"\n";
            
    }

}


int* zwieksz(int *tab, int &tab_size)
{
    tab_size++;

    int *temp_tab = new int [tab_size-1];

    for (int i = 0; i < tab_size-1; i++)
    {
        temp_tab[i] = tab[i];
    }

    delete []tab;


    return temp_tab;
}

Czyli problem posostal dalej nierozwiazany. Dzieki za wszelką pomoc

0

Błąd polega na tym że robisz dwie zagnieżdżone pętle z jednym licznikiem to raz.
Dwa tworzysz tablicę o mniejszej ilości elementów niż sie odnosisz ;]
W pierwszej iteracji tworzysz tablicę o rozmiarze 1 (czyli masz tylko tab[0]) a w drugiej iteracji tej najbardziej zewnętrznej pętli odnosisz się do tab[i] czyli w tym wypadku do tab[1] którego nie ma.
Usuń na przykład te -1 z kodu i zadziała.

0

Działa. Dzieki za pomoc. Masz u mnie [browar]

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