util.smartptr.shared.const / 9 w C ++ 11:
Efekty: Konstruuje obiekt shared_ptr, który jest właścicielem obiektu p i usuwacza d. Drugi i czwarty konstruktor używają kopii pamięci w celu alokacji pamięci do użytku wewnętrznego.
Drugi i czwarty konstruktor mają następujące prototypy:
template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
template<class D, class A> shared_ptr(nullptr_t p, D d, A a);
W najnowszej wersji pliku util.smartptr.shared.const / 10 jest równoważny z naszym celem:
Efekty: Konstruuje obiekt shared_ptr, który jest właścicielem obiektu p i usuwacza d. Gdy T nie jest typem tablicy, pierwszy i drugi konstruktor umożliwiają share_from_this z p. Drugi i czwarty konstruktor używają kopii pamięci w celu alokacji pamięci do użytku wewnętrznego. Jeśli zgłoszony zostanie wyjątek, wywoływane jest d (p).
Dlatego alokator jest używany, jeśli zachodzi potrzeba alokacji go w przydzielonej pamięci. Na podstawie obecnego standardu i na podstawie odpowiednich raportów o wadach przydział nie jest obowiązkowy, ale zakłada komitet.
Chociaż interfejs shared_ptr
pozwala implementacja tam, gdzie nigdy nie jest blok sterowania i wszystko shared_ptr
i weak_ptr
są umieszczane w połączonej listy, nie ma takiego wdrożenia w praktyce. Ponadto zmodyfikowano sformułowanie, zakładając na przykład, że use_count
jest ono wspólne.
Deleter jest wymagany tylko do ruchu konstrukcyjnego. Dlatego nie jest możliwe posiadanie kilku kopii w shared_ptr
.
Można sobie wyobrazić implementację, która umieszcza separator w specjalnie zaprojektowanym shared_ptr
i przenosi go, gdy jest shared_ptr
on usuwany. Chociaż implementacja wydaje się zgodna, jest to również dziwne, zwłaszcza, że do liczenia użycia może być potrzebny blok kontrolny (być może jest to możliwe, ale jeszcze dziwniejsze, aby zrobić to samo z liczbą użytych).
Odpowiednie DR, które znalazłem: 545 , 575 , 2434 (które potwierdzają, że wszystkie implementacje używają bloku sterującego i wydają się sugerować, że ograniczenia wielowątkowe w pewien sposób tego wymagają), 2802 (co wymaga, aby deleter poruszał się konstruowalnie, a tym samym uniemożliwiał implementację w przypadku, gdy usuwacz jest kopiowany pomiędzy kilkoma shared_ptr
.