[C++] Referencja i zwalnianie pamięci (delete)

Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Referencja i zwalnianie pamięci (delete)

Post autor: mortan517 »

Witam, mam pytanie odnośnie takiego kodu. Mamy funkcję zwracającą referencję do struktury free_throws.

Kod: Zaznacz cały

const free_throws & clone(free_throws & ft)
{
     free_throws * pt = new free_throws();
     *pt = ft;
     return *pt;
}
I używamy tej funkcji w ten sposób:

Kod: Zaznacz cały

free_throws three = {"tekst", 7, 9};
free_throws & jolly = clone(three);
Jak powinno wyglądać teraz zwolnienie pamięci?

Według mnie zaalokowaliśmy pamięć i pt przechowuje adres początku tego miejsca w pamięci. Skoro zwracamy *pt oznacza to, że zwracamy strukturę, a dokładniej referencję do struktury. Czy zwolnienie powinno wyglądać tak?

Kod: Zaznacz cały

delete &jolly;
Aterwik
Użytkownik
Użytkownik
Posty: 16
Rejestracja: 15 kwie 2015, o 19:08
Płeć: Mężczyzna
Lokalizacja: Kujawsko-Pomorskie
Podziękował: 3 razy
Pomógł: 4 razy

[C++] Referencja i zwalnianie pamięci (delete)

Post autor: Aterwik »

Tak, technicznie jest to prawidłowy sposób na zwolnienie pamięci. W praktyce jednak cały ten kod to jedno wielkie proszenie się o wyciek pamięci. Nie dość, że używasz operatora new, którego powinno się unikać, o ile nie jest naprawdę konieczny, to jeszcze ukrywasz go w funkcji. Jeśli chcesz skopiować obiekt, to nie lepiej zrobić to tak?

Kod: Zaznacz cały

free_throws three = {"tekst", 7, 9};
free_throws jolly = three;
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Referencja i zwalnianie pamięci (delete)

Post autor: mortan517 »

Dzięki za odpowiedź. No pewnie, że tak jest lepiej, ale ten kod jest wyciągnięty z Praty, gdzie była mowa akurat o referencjach. Były tam również wskazówki, że ukrywanie new w funkcjach nie jest najlepszym pomysłem. Natomiast pamięć była zaalokowana, ale nie podano kodu na zwolnienie tego obszaru, więc chciałem po prostu wiedzieć jak to będzie wyglądać, gdy będę musiał zrobić coś takiego
ODPOWIEDZ