[C++] Czy to jest wyciek ?

0

witam,
chciałem sie zapytać czy coś takiego to będzie wyciek pamięci : mam klasę Matrix

 /* ... */private:
	                      float **arr;
	                      unsigned size;

która usuwa grzecznie float ** arr w destruktorze, ALE w innej fukncji użyłem:

	Matrix * m = new Matrix(size);
/* ...................*/
	return *m;   

czy będzie z tym problem czy nie ? jeżeli tak to jak to obejść? ( jeżeli ktoś sugeruje żeby zamiast wskaźnika na Matrix użyc po prostu obiektu tupy Matrix to przy zwracaniu go w stylu return m moja aplikacja się wysypuje (błędów nie dostaję ale jest coś takiego :

Unhandled exception at 0x0029409e in mathDemo.exe: 0xC0000005: Access violation reading location 0xfeeefeee.

i VS pokazuje mi że coś nie śmiga w moim

 
ostream & operator<<(ostream& out, const Matrix & m)
1

Jest ok, o ile potem wywołasz delete na wskaźnika który ta funkcja ci zwróci.
Użycie tutaj obiektu klasy Matrix niewątpliwie wysypie program o ile nie masz sensownie zaimplementowanego konstruktora kopiującego i operatora przypisania. Czemu? Bo zrobieni czegoś takiego:

Matrix funkcja()
{
Matrix m;
//
return m;
}
Spowoduje że lokalnie utworzysz obiekt typu Matrix, a potem robiąc return m spowodujesz zwrócenie kopii tego obiektu (utworzonej przez konstruktor kopiujący dodany automatycznie -> kopiujący pole po polu). Ta kopia jest o tyle słaba że skopiuje sobie tylko wskaźniki -> będziesz miał dwa obiekty ze wskaźnikami pokazujacymi na to samo. Ale jeden z tych obiektów po wyjsciu z funkcji ulegnie zniszczeniu, bo jest lokalny. Jego destruktor zwolni pamięć pokazywaną przez wskaźniki. Oznacza to ze z funkcji zostanie ci zwrócony obiekt Matrix ale ze wskaźnikami pokazującymi w obszary pamięci które nie są twoje. Użycie tego obiektu wysypie ci program.

0

OK, dzięki za odpowiedź. Teraz już wiem czemu takie rzeczy się działo w podobnych sytuacjach w innych klasach.
a czy jest jakas opcja żeby zrobić zwalnianie tego wskaźnika w obrębie tej metody ? Bo wielce prawdopodobne jest to, że zwalnianie go poza metodą zostanie zapomniane.

0

Istnieje coś takiego jak smart-pointery i chyba o to ci w tym przypadku chodzi.

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