Wyciek pamięci

0

Witam,
mam problem z wyciekiem pamięci przy użyciu pewnych operatorów. Wywołuję w pętli pociag++, a następnie pociag--, ale po ostatniej operacji pamięć używana przez program nie zmniejsza się. Nie mogę zlokalizować mojego błędu. Oba operatory definiowałem na różne sposoby, ale za każdym razem pojawiał się ten sam problem. Dopiero zaczynam naukę C++, więc proszę o wyrozumiałość, zdaję sobie sprawę, że problem może być trywialny. Z góry dziękuję za pomoc :)

(wszystkie fragmenty kodu ograniczyłem tylko do tych istotnych dla problemu)

Definicja klas:

class Pociag{
private:
	Wagon* wagony;
	int liczba_wagonow;
} 

Destruktory i używany w poniższych operatorach operator =:

 Pociag::~Pociag()
{
	if (wagony!=NULL)
		delete[]wagony;
}


Pociag & Pociag::operator = (const Pociag &pociag)
{	
	liczba_wagonow = pociag.liczba_wagonow;
	if (liczba_wagonow > 0)
	{	delete[]wagony;
		wagony = new Wagon[liczba_wagonow];
		for (int i = 0; i < liczba_wagonow; i++)
			wagony[i] = pociag.wagony[i];
	}
	else {
		wagony=NULL;
	}
	return *this;
}

Oraz dwa sprawiające problem operatory:

 Pociag Pociag::operator ++ (int)
{
	Pociag tymczasowy=*this;
	liczba_wagonow++;
	delete[]wagony;
	wagony = new Wagon[liczba_wagonow];

	for (int i = 0; i < liczba_wagonow-1; i++)
		wagony[i] = tymczasowy.wagony[i];

	return tymczasowy; 
}

Pociag Pociag::operator -- (int)
{
	
	if (liczba_wagonow > 0)
	{
		Pociag tymczasowy=*this;
	liczba_wagonow--;
	delete[]wagony;
	wagony = new Wagon[liczba_wagonow];

	for (int i = 0; i < liczba_wagonow; i++)
		wagony[i] = tymczasowy.wagony[i];

	return tymczasowy;
	}
	else {
	cout << "Pociag nie ma wagonow!" << endl;
	return *this;
	}
}
1

powinienes zmienic algorytm.
Zamiast kazdorazowo usuwac blok pamieci i przydzielac kolejny blok pamieci o jeden wiekszy (co jest bardzo nieefektywne) zwiekszaj blok pamieci dwukrotnie. Na poczatku powiedzmy ze stworzysz tablice 16 obiektow. Jezeli za ++ bedziesz juz zaraz przekraczac to 16 (lub przekroczysz) to wtedy zwieksz do 32.

To sprawi, ze zapewne nie bedziesz miec juz problemow z Twoim kodem.

Jezeli chcesz sie upierac przy swoim kodzie to uzyj debuggera.

1
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091

Pokaż konstruktor kopiujący, bo tu: Pociag tymczasowy=*this; odpalasz konstruktor kopiujący nie operator = czytaj copy elision

3

Ponad to co napisali koledzy wyżej:

  1. Łamiesz SRP, rule of zero (zapoznaj się z obydwoma pojęciami). Użyj std::vector zamiast nagich wskaźników.
  2. w operatorze= przesłaniasz zmienną liczba_wagonow ⟶ jeśli przypiszesz pociąg z liczbą wagonów 0 do jakiegoś z milionem, to tego miliona nie zwalniasz.
  3. wszystkie fragmenty kodu ograniczyłem tylko do tych istotnych dla problemu - no właśnie nie bardzo.

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