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