Dynamiczna tablica obiektów...

0

Witam,
z programowaniem dopiero zaczynam swoje podboje więc proszę z góry nie krzyczeć ze coś zrobiłem źle bo wiem że tak jest :)

Mam problem z alokacja tablicy obiektów którą tworze dynamicznie (ilość obiektów jest zwiększana wraz z odczytem kolejnej danej z pliku) wszystko niby działa jak należy ale sa (jak to sie fachowo nazywa) wycieki pamięci :)

Oto co stworzyłem:


Produkt *produkty; //tablica produktow 

int czytajProdukty() //czytanie produktow z pliku, jezeli blad zwraca 0 inaczej zwraca liczbe wczytanych produktow
{

int i = 0; // licznik produktow

...
        Produkt *prod_temp; //tablica zapasowa produktow
        prod_temp = new Produkt[i];

        for (int j=1; j<i; ++j)    //przepisuje stara tablice do nowej
        {
            prod_temp[j] = produkty[j];
        }

        produkty = prod_temp;
        //delete [] prod_temp;
...
   tutaj operacje na pliku
...
                na koncu poproastu przypisuje wartosci do obiektu za pomoca funkcji

        produkty[i].Ustaw(temp_nazwa, atoi(temp_ilosc), atof(temp_cena)); 

Problem jest w sumie cząstkowy bo program działa jak należny tylko że jest jedno ale, nie zawszem tzn czasami wszystko dziala jak nalezy a czasami wysypuje sie przy odczytaniu kolejnej danej.
Wiem ze sa tutaj ludzie którzy wiedza więcej ode mnie wiec prosze o sugestie, porady i ew rozwiazanie problemu...
PS.
Nie mogę tez zwolnic pamięci np z utworzonej tymczasowo tablicy, moze ktos powiedziec czemu?
Dodam również ze przy kompilacji nie ma żadnych błędów

1

1) Czy produkty ma i elementów? Nawet jeśli ma, to nadal produkty[i] wygląda podejrzanie, bo jeśli ma dokładnie i elementów, to ostatni indeks to i-1.
2) Ogólnie tablice są indeksowane od 0, aczkolwiek jeśli konsekwentnie używasz od 1, to "jedynie" marnujesz 1 pole (+ zły nawyk).
3) Usuwanie starej tablicy:

produkty = prod_temp;
//delete [] prod_temp;

prawidłowo powinno być:

delete[] produkty;
produkty = prod_temp;
0

Dzięki za odpowiedz,chyba powinienem sie przespać bo robię błędy na poziomie podstawówki :p

1

wywal tablicę i użyj std::vector i push_back/emplace_back, jeżeli Twoja logika jest poprawna to wszystko powinno działać poprawnie

0

Z góry mam narzucone używać operatora new, ale dzięki również za odpowiedź :)

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