Wpis z mikrobloga

@MamCieNaHita Wynik to 1? Struct bedzie mial publiczne dziedziczenie. Destruktor nie jest wirtualny a globalny int jest inicjowany jako 0. Tylko raz wywola sie destruktor bazowy. Chyba mamy UB.
  • Odpowiedz
@MamCieNaHita: Odpowiedź to dwa, ale oszukiwałem i wpisałem kod do komputera. Na pewno make_shared tworzy obiekt Derived, a potem, jak się domyślam, zostaje stworzona jakaś niepotrzebna kopia która przyczynia się do zwiększenia licznika. Czekam na wytłumaczenie.
  • Odpowiedz
@klucz_dynamometryczny: Też odpaliłem i wywoływany jest destruktor Derived co chyba nie powinno być przy braku wirtualnego destruktora Base. Chyba po prostu to jest UB kiedy usuwany jest obiekt za pomocą wskaźnika na klasę bazową(bez wirtualnego destruktora).

PS: Przy zwykłym new,delete mamy 1, przy sharedptr mamy 2, sharedptr nawet w przypadku braku virtual poprawnie wywołuje destruktor, pytanie czy jest to zdefiniowane zachowanie?
  • Odpowiedz
@MamCieNaHita: LOL to jest trudne? Przecież to podstawy obiektówki.
No dobra std::make_shared może być podchwytliwe dla ludzi, bo niema o tym zbyt wiele i tego nie uczą, więc którzy tego nie znają mogą mieć problem, ale gdy by było new to był oblał na egzaminie takiego delikwenta.
Jak by było w 27 linijce przypisanie do counter to by było ciekawsze i bardziej pouczające.
Trudne to by było jak byś zrobił strukturę
  • Odpowiedz
LOL to jest trudne? Przecież to podstawy obiektówki.


@lionbest: LOL jakie podstawy obiektówki? rozwiązanie tego problemu wymaga znajomości działania sharedptr. to wcale nie jest takie oczywiste, że obiekt sharedptr przechowuje destruktor klasy Derived i wywoła go w swoim destruktorze.
  • Odpowiedz