2010-12-20 8 views
16

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?

+1

Niezupełnie duplikat: http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong –

Odpowiedz

34

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.

5

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 posiada weak_ptr obiektu wskazuje to na obiekt pochodny . Istnieje jednak problem z kurczęciem i jajkiem, o tym, jak zainicjować ten obiekt weak_ptr , gdy nie ma odpowiedniego obiektu. Realizacja Sztuką jest to, że konstruktorzy dla shared_ptr wiedzieć o enable_shared_from_this i ustawić obiekt weak_ptr podczas budowy shared_ptr obiekt, który posiada zasób, który ma enable_shared_from_this jako publiczne klasy bazowej.

1

koncepcyjnej shared_from_this() wybiera shared_ptr skierowaną this i zwraca kopię.

W konstruktorze nie ma numeru shared_ptr wskazującego na this.

Powiązane problemy