• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zwrócić z funkcji obiekt utworzony w jej bloku?

Object Storage Arubacloud
0 głosów
307 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez jankustosz1 Nałogowiec (35,880 p.)
edycja 3 maja 2016 przez jankustosz1

Weźmy taki przykład:

class Klasa
{
   int cos;
public:
   Klasa(int param)
      : cos(param){}
};

//przykład 1

Klasa &getNowyObj()
{
   return *(new Klasa(0)); // wyciek pamięci więc złe
}

//przykład 2

Klasa& getNowyObj()
{
   return Klasa(0); // obiekt usuwany po wyjściu z bloku więc zwraca się wolne miejsce więc złe
}

//przykład 3

Klasa getNowyObj()
{
   return Klasa(0); // obiekt kopiowany, następnie pierwszy jest usuwany a drugi zostaje
}

 

Może mi ktoś powiedzieć dlaczego przykład 3 jest zły i jak powinien wyglądać dobry?

2 odpowiedzi

0 głosów
odpowiedź 3 maja 2016 przez criss Mędrzec (172,590 p.)
wybrane 3 maja 2016 przez jankustosz1
 
Najlepsza

Dlaczego zły? Powiedziałbym nawet, że jest perfekcyjny. Ciężko o coś bardziej wydajnego, a to dzięki tzw. RVO (return value optimization) - specjalnej optymalizacji dokonywanej przez kompilator. Chodzi o to, że nie będzie tu wykonana żadna kopia. Jeśli funkcja zwraca rvalue, to funkcja wołająca getNowyObj() alokuje pamięć od razu na swoim stacku i obiekt zwracany z getNowyObj() jest tworzony od razu tam, zamiast najpierw wewnątrz getNowyObj. Tutaj może troche jaśnie..

komentarz 3 maja 2016 przez jankustosz1 Nałogowiec (35,880 p.)
Mówisz to o 2 przykładzie?
komentarz 3 maja 2016 przez criss Mędrzec (172,590 p.)
O trzecim.
komentarz 3 maja 2016 przez criss Mędrzec (172,590 p.)
edycja 3 maja 2016 przez criss

http://coliru.stacked-crooked.com/a/7c635cc67f8a6ad5

edit: Hemm, dziwne tak też nie uruchamia copy constructora.. http://coliru.stacked-crooked.com/a/95642e8a749795fe Czyli optymalizacja jest jeszcze bardziej, niż mówiłem. Daje lajka.

0 głosów
odpowiedź 3 maja 2016 przez jegor377 Stary wyjadacz (13,230 p.)
a dlaczego 3 jest zły? Wg. wszystko ok. Ja tak dodawałem często obiekty do listy. ;)
komentarz 3 maja 2016 przez jankustosz1 Nałogowiec (35,880 p.)
m 2 jest na pewno zły, 1 może być dobry jak się w kodzie rzutuje na wskaźnik i usunie.

Trzeciego właśnie nie jestem pewny, mam błąd w programie i wydaje mi się że to właśnie coś z tym jest nie tak. Oczywiście w 3 przykładzie klasa nie może w destruktorze usuwać wskaźników bo robi się kopia tylko adresów to wiem.
komentarz 3 maja 2016 przez jegor377 Stary wyjadacz (13,230 p.)
dlaczego 2 jest zły? przykład 2 tworzy obiekt i zwraca referencje na niego. Pierwszy tworzy nowy obiekt gdzieś w pamięci, zwraca wskaźnik, ten go wyłuskuje i zwraca jako kopie. w 3 po prostu zwraca kopie.
komentarz 3 maja 2016 przez jegor377 Stary wyjadacz (13,230 p.)
a nie dobra racja. w 1 nie kasuje obiektu xd
komentarz 3 maja 2016 przez jankustosz1 Nałogowiec (35,880 p.)
w pierwszym się po sobie nie sprząta - kompilator błędu nie wyrzuci :D

w 2 jest źle gdyż stworzony obiekt jest od razu usuwany. Jakby tak nie było to pisałoby się np. int *wsk = &int()
komentarz 3 maja 2016 przez criss Mędrzec (172,590 p.)
Pierwszy przykład.. Zwraca referencje, więc sam w sobie wycieku nie robi, ale bardzo niebezpieczny kod i czegoś takiego nie powinno się pisać. Co do trzeciego - odsyłam do mojej odpowiedzi.

Podobne pytania

–1 głos
1 odpowiedź 138 wizyt
+2 głosów
0 odpowiedzi 574 wizyt

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...