Tylko małe zapytanie dotyczące shared_ptr
.
Czy warto shared_ptr
wskazać tablicę? Na przykład,
shared_ptr<int> sp(new int[10]);
Jeśli nie, to dlaczego nie? Jednym z powodów, o których już wiem, jest to, że nie można zwiększać / zmniejszać wartości shared_ptr
. Dlatego nie może być używany jako normalny wskaźnik do tablicy.
c++
c++11
shared-ptr
tshah06
źródło
źródło
std::vector
. Musisz uważać, aby przekazać tablicę przy użyciu referencji, aby nie robić jej kopii. Składnia dostępu do danych jest czystsza niż shared_ptr, a zmiana jej rozmiaru jest bardzo łatwa. I dostajesz całą dobroć STL, jeśli kiedykolwiek chcesz.std::array
. Jest prawie taka sama jak tablica surowa, ale z odpowiednią semantyką do użycia w większości składników bibliotek. Szczególnie obiekty tego typu są niszczonedelete
, a niedelete[]
. W przeciwieństwie do tegovector
, przechowuje dane bezpośrednio w obiekcie, więc nie ma dodatkowej alokacji.Odpowiedzi:
Z C ++ 17 ,
shared_ptr
mogą być używane do zarządzania dynamicznie przydzielonego tablicy.shared_ptr
Szablon argumentem w tym przypadku musi byćT[N]
alboT[]
. Więc możesz pisaćOd n4659, [util.smartptr.shared.const]
Aby to obsługiwać, typ pręta
element_type
jest teraz zdefiniowany jakoDostęp do elementów tablicy można uzyskać za pomocą
operator[]
Przed C ++ 17 ,
shared_ptr
mogłoby nie być używane do zarządzania dynamicznie przydzielone tablice. Domyślnieshared_ptr
wywoładelete
zarządzany obiekt, gdy nie będzie już do niego odwołań. Jednak podczas przydzielania zasobównew[]
musisz zadzwonićdelete[]
, a niedelete
zwolnić zasób.Aby poprawnie używać
shared_ptr
z tablicą, musisz dostarczyć niestandardowy element usuwający.Utwórz shared_ptr w następujący sposób:
Teraz
shared_ptr
będzie poprawnie dzwonićdelete[]
podczas niszczenia zarządzanego obiektu.Powyższy niestandardowy usuwacz może zostać zastąpiony przez
std::default_delete
częściowo kierunek typów tablicowewyrażenie lambda
Ponadto, jeśli nie potrzebujesz współdzielenia zarządzanego obiektu,
unique_ptr
lepiej nadaje się do tego zadania, ponieważ ma częściową specjalizację dla typów tablic.Zmiany wprowadzone przez rozszerzenia C ++ dotyczące podstaw biblioteki
Inną alternatywą przed C ++ 17 do tych wymienionych powyżej była specyfikacja techniczna Library Fundamentals , która została rozszerzona,
shared_ptr
aby umożliwić jej działanie od razu po wyjęciu z pudełka w przypadkach, gdy posiada tablicę obiektów. Aktualny projektshared_ptr
zmian przewidzianych dla tego TS można znaleźć w N4082 . Te zmiany będą dostępne za pośrednictwemstd::experimental
przestrzeni nazw i zawarte w<experimental/memory>
nagłówku. Oto kilka istotnych zmian dotyczących obsługishared_ptr
tablic:-
element_type
Zmienia się definicja typu pręta- Członek
operator[]
jest dodawany- W przeciwieństwie do
unique_ptr
częściowej specjalizacji dla tablic, obashared_ptr<T[]>
ishared_ptr<T[N]>
będą prawidłowe i oba spowodujądelete[]
wywołanie z zarządzanej tablicy obiektów.źródło
shared-array
.shared_ptr::get
zwraca wskaźnik do zarządzanego obiektu. Możesz więc używać go jakosp.get()[0] = 1; ... sp.get()[9] = 10;
std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );
zobacz także en.cppreference.com/w/cpp/memory/default_deletestd::shared_ptr<std::array<int,N>>
powinno wystarczyć.unique_ptr
uzyskuje tę częściową specjalizację, aleshared_ptr
nie?Prawdopodobnie łatwiejszą alternatywą, z której możesz skorzystać, jest
shared_ptr<vector<int>>
.źródło
shared_ptr<array<int, 6>>
.