Używam enable_shared_from_this<Base>
, a następnie dziedziczę po Base
. Podczas próby użycia konstruktora shared_from_this()
w Derived
(nie lista inicjalizatora), otrzymuję wyjątek. Okazuje się, że wewnętrzny słaby wskaźnik jest pusty i wcale nie wskazuje na this
. Jak to się może stać? Mój drugi przypadek użycia dokładnie to działa doskonale. Nie wiem nawet, od czego zacząć. Spojrzałem na kod źródłowy enable_shared_from_this
i wygląda na to, że ten wskaźnik zawsze będzie miał wartość nullptr.enable_shared_from_this - pusty wewnętrzny słaby wskaźnik?
Odpowiedz
nie można nazwać shared_from_this()
w konstruktora obiektu. shared_from_this()
wymaga, aby obiekt był własnością co najmniej jednego shared_ptr
. Przed zbudowaniem obiekt nie może być własnością obiektu shared_ptr
.
Przypuszczam, że wewnętrzny słaby wskaźnik jest ustawiony, gdy shared_ptr
bierze własność przedmiotu po raz pierwszy. Przed tym punktem nie ma struktury licznika odwołań, którą może wskazać słaby wskaźnik.
James McNellis's answer ma rację.
chodzi o wyjaśnienie szablonu enable_shared_from_this
samego, który jak można zaobserwować wydaje się zrobić nic, uwaga 7 na dole this page wyjaśnia:
... szablon
enable_shared_from_this
posiadaweak_ptr
obiektu wskazuje to na obiekt pochodny . Istnieje jednak problem z kurczęciem i jajkiem, o tym, jak zainicjować ten obiektweak_ptr
, gdy nie ma odpowiedniego obiektu. Realizacja Sztuką jest to, że konstruktorzy dlashared_ptr
wiedzieć oenable_shared_from_this
i ustawić obiektweak_ptr
podczas budowyshared_ptr
obiekt, który posiada zasób, który maenable_shared_from_this
jako publiczne klasy bazowej.
koncepcyjnej shared_from_this()
wybiera shared_ptr
skierowaną this
i zwraca kopię.
W konstruktorze nie ma numeru shared_ptr
wskazującego na this
.
Niezupełnie duplikat: http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong –