Po fakcie, biorąc pod uwagę make_shared
, czy shared_ptr
ma konstruktor, który pobiera surowy wskaźnik, gdyby został wprowadzony w C++ 11?był konstruktorem wskaźnika surowego z shared_ptr a błąd?
Czy istnieją silne argumenty lub przypadki użycia na korzyść tego konstruktora?
Unikałoby dobrze udokumentowanej pułapki exception-safety i memory allocation/performance advantage korzystania z make_shared
.
wierzę kolejną zaletę, że wymaga shared_ptr
budowę poprzez make_shared
byłoby, że może to być pojedynczy wskaźnik pod maską, obniżając jego wykorzystanie pamięci i dokonując rzeczy jak atomic_compare_exchange dużo prostsze (i ewentualnie bardziej wydajne). (Patrz presentation from C++Now)
EDIT
Rozumiem, że shared_ptr, że w zasadzie jest intrusive_ptr (z przedmiotem i bloku sterowania coalesced) brakowałoby dysponuje aktualną std :: shared_ptr ma. Jak:
zdolność do uwolnienia przedmiotu osobno z bloku sterowania (co jest miłe, jeśli od dawna mieszkał weak_ptrs)
zgodność z bibliotekami że ręka ci surowych wskaźników i odpowiedzialność, aby je uwolnić
zdolność do przechowywania dowolnych zasobów z niestandardowymi deleters (lub bez Deleter, dla osób nie posiadających wskaźników)
możliwość wskazują na sub-object (np członk er) przy jednoczesnym utrzymaniu żywego obiektu nadrzędnego.
Co mam co sugeruje, że te funkcje nie mogą być wykorzystywane na tyle często (lub w przypadku użycia go jako RAII-wrapper) mogą nie być najlepsze dopasowanie, aby uzasadnić dodatkowych kosztów:
- oddzielny wskaźnik do bloku sterowania
- (potencjalnie) bardziej skomplikowanej logiki atomic_compare_exchange, nie może być warto.
W C++ 98 świecie (gdzie shared_ptr został wprowadzony) make_shared jest mniej praktyczny i przyjazny mniej użytkownika (brak idealnego spedycji wymaga owijarki referencyjnych oraz brak zmiennej liczbie argumentów szablonów sprawia, że realizacja przylegający).
Co, jeśli nie kontrolujesz konstrukcji obiektu? (Powiedzmy, że zarządzasz zasobem z biblioteki C). –
'make_shared' został wprowadzony w C++ 11. –
@NicolBolas prawy, i shared_ptr został wprowadzony w C++ 03 – Arvid