Juste une petite question concernant shared_ptr
.
Est-ce une bonne pratique d'utiliser le shared_ptr
pointage vers un tableau? Par exemple,
shared_ptr<int> sp(new int[10]);
Sinon, pourquoi pas? L'une des raisons dont je suis déjà conscient est que l'on ne peut pas augmenter / décrémenter le shared_ptr
. Par conséquent, il ne peut pas être utilisé comme un pointeur normal vers un tableau.
c++
c++11
shared-ptr
tshah06
la source
la source
std::vector
. Vous devrez faire attention à passer le tableau en utilisant des références afin de ne pas en faire des copies. La syntaxe pour accéder aux données est plus propre que shared_ptr, et son redimensionnement est très très simple. Et vous obtenez tous les bienfaits de la STL si vous le souhaitez.std::array
. C'est presque la même chose qu'un tableau brut, mais avec une sémantique appropriée pour une utilisation dans la plupart des composants de la bibliothèque. Surtout les objets de ce type sont détruits avecdelete
, nondelete[]
. Et contrairement àvector
, il stocke les données directement dans l'objet, de sorte que vous n'obtenez aucune allocation supplémentaire.Réponses:
Avec C ++ 17 ,
shared_ptr
peut être utilisé pour gérer un tableau alloué dynamiquement. L'shared_ptr
argument de modèle dans ce cas doit êtreT[N]
ouT[]
. Alors tu peux écrireÀ partir de n4659, [util.smartptr.shared.const]
Pour prendre en charge cela, le type de membre
element_type
est désormais défini commeLes éléments du tableau peuvent être accédés en utilisant
operator[]
Avant C ++ 17 ,
shared_ptr
ne pouvait pas être utilisé pour gérer des tableaux alloués dynamiquement. Par défaut,shared_ptr
appelleradelete
l'objet géré lorsqu'il ne lui restera plus aucune référence. Cependant, lorsque vous attribuez une utilisation,new[]
vous devez appelerdelete[]
et nondelete
libérer la ressource.Afin de l'utiliser correctement
shared_ptr
avec un tableau, vous devez fournir un suppresseur personnalisé.Créez le shared_ptr comme suit:
Maintenant
shared_ptr
sera correctement appelédelete[]
lors de la destruction de l'objet géré.Le suppresseur personnalisé ci-dessus peut être remplacé par
la
std::default_delete
spécialisation partielle des types de tableauxune expression lambda
De plus, à moins que vous n'ayez réellement besoin d'un partage de l'objet géré, a
unique_ptr
est mieux adapté pour cette tâche, car il a une spécialisation partielle pour les types de tableaux.Modifications introduites par les extensions C ++ pour les principes de base de la bibliothèque
Une autre alternative pré-C ++ 17 à celles répertoriées ci-dessus a été fournie par la spécification technique de Library Fundamentals , qui a été augmentée
shared_ptr
pour lui permettre de fonctionner immédiatement dans les cas où elle possède un tableau d'objets. Le projet actuel desshared_ptr
modifications prévues pour ce TS se trouve dans N4082 . Ces changements seront accessibles via l'std::experimental
espace de noms, et inclus dans l'en-<experimental/memory>
tête. Quelques-uns des changements pertinents pour la prise en chargeshared_ptr
des tableaux sont:- La définition du type de membre
element_type
change- Un membre
operator[]
est ajouté- Contrairement à la
unique_ptr
spécialisation partielle pour les tableaux, les deuxshared_ptr<T[]>
etshared_ptr<T[N]>
seront valides et les deux aboutiront àdelete[]
être appelés sur le tableau d'objets géré.la source
shared-array
.shared_ptr::get
renvoie un pointeur vers l'objet géré. Vous pouvez donc l'utiliser commesp.get()[0] = 1; ... sp.get()[9] = 10;
std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );
voir aussi en.cppreference.com/w/cpp/memory/default_deletestd::shared_ptr<std::array<int,N>>
devrait suffire.unique_ptr
obtient-on cette spécialisation partielle maisshared_ptr
pas?Une alternative peut-être plus simple que vous pourriez utiliser est
shared_ptr<vector<int>>
.la source
shared_ptr<array<int, 6>>
.