Niszczenie kopii obiektu po wyjściu z funkcji

0

Najprostszy kod na jaki wpadłem ilustrujący problem:

#include <iostream>

using namespace std;

class Klasa
{
	public:
	int *jakisWskaznik;

	Klasa()
	{
		jakisWskaznik = new int;
		*jakisWskaznik = 50;
	}

	~Klasa()
	{
		delete jakisWskaznik;
	}

	int get()
	{
		return *jakisWskaznik;
	}
};

void funkcjaZPomylka(Klasa klasa)
{
	cout << klasa.get() << endl;
}

int main()
{
	Klasa test;
	funkcjaZPomylka(test);
	funkcjaZPomylka(test);

	return 0;
}

problem polega na tym że po pierwszym wywołaniu "funkcjaZPomylka" tworzona jest kopia obiektu Klasa, ale nie kopiują się zmienne spod wskaźników wskutek czego za pierwszym razem wyświetla się poprawnie wartość "50", ale wraz z wyjściem z funkcji wywołuje się destruktor który niszczy zmienną i przy drugim wywołaniu mamy już jakieś śmieci

oczywiście jeśli klasę przesłać przez referencję to wszystko jest w porządku, ale gdzieś w programie przecież mogę się pomylić, zapomnieć o tym jednym znaczku i błąd będzie raczej ciężki do znalezienia

co przeoczyłem?

0

gdy przechowujesz takie "gołe" wskaźniki to w klasie poza przydziałem pamięci musisz zdefiniować konstruktor kopiujący i przeciążyć operator przypisania gdzie przydzielisz nową pamięć.

0

W tej sytuacji jest kilka rozwiązań:

  • możesz zrobić konstruktor kopiujący, (dla klasy A o deklaracji A(const& A)) który kopiuje dane pod które wskazuje wskaźnik,
  • możesz samemu zrobić licznik kopii,
  • możesz użyć shared_ptr z c++11 lub z boosta, wtedy dane nie będą kopiowane i destruktor jest niepotrzebny (gdy nie będzie żadnych wskaźników do danego zasobu, to wtedy zostanie wywołany delete),
  • możesz zablokować konstruktor kopiujący deklarując go jako prywatny, wtedy przy tak napisanej funkcji kod się nie skompiluje,
  • dziedziczenie po boost::noncopyable robi to samo, co punkt wyżej, ale bardziej przekazuje intencję programisty.
0

zadeklarowałem konstruktor jako prywatny bo nie widzę sensu jego kopiowania i byłoby to dość złożone i czasochłonne
dzięki

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