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
.
- 1. Podwójne dziedziczenie enable_shared_from_this
- 2. Dlaczego odjąć pusty wskaźnik w offsetof()?
- 3. Dlaczego "ten" wskaźnik jest pusty w delegacie?
- 4. Użycie enable_shared_from_this z wieloma dziedziczeniami
- 5. Słaby polimorfizm w OCaml
- 6. Jak wyświetlić słaby "tekst widmowy" w JTextField?
- 7. Prosty, skuteczny słaby wskaźnik ustawiony na wartość NULL po zwolnieniu pamięci docelowej
- 8. C++ wyrównanie - surowe i słaby
- 9. enable_shared_from_this (C++ 0x): co robię źle?
- 10. enable_shared_from_this nie działa na Xcode 5
- 11. test słaby odniesienia przed użyciem Java
- 12. Ocenianie Lista słaby szef Normal Form
- 13. Nie ma logicznego odpowiednika słaby! w Swift
- 14. bazowy wskaźnik i wskaźnik stosu
- 15. wewnętrzny interfejs * mniej * dostępne niż wewnętrzny chroniony konstruktor?
- 16. C# wewnętrzny adres statyczny z atrybutem InternalCall - wewnętrzny czy zewnętrzny?
- 17. Czy enable_shared_from_this i make_shared zapewniają tę samą optymalizację
- 18. Wewnętrzny błąd serwera 500.24
- 19. SolrException: Wewnętrzny błąd serwera
- 20. Wewnętrzny błąd serwera Flask
- 21. Django - Oracle błąd wewnętrzny
- 22. przechodzącej wskaźnik obiekt jako protokół wskaźnik
- 23. Wskaźnik wirtualny
- 24. NULL == wskaźnik
- 25. wewnętrzny odnośnik zapobiega zbieraniu śmieci
- 26. Delphi: F2084 Błąd wewnętrzny T2575
- 27. Ajax - 500 Wewnętrzny błąd serwera
- 28. Tworzenie wewnętrzny cień w UIView
- 29. Wewnętrzny moduł isee_arithmetic w gfortran
- 30. usuń wewnętrzny cień wprowadzania tekstu
Niezupełnie duplikat: http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong –