J'essaie de comprendre, que se passe-t-il si vous créez un pointeur partagé, cela pointe vers un objet qui se tient dans un vecteur.
Le code ressemble à ceci: P>
class TestObject { public: int someTestData; }; class Test { public: std::shared_ptr<TestObject> testPointer; std::shared_ptr<std::vector<TestObject>> getTestVector() { return testVector; } private: std::shared_ptr<std::vector<TestObject>> testVector; };
EDIT: P>
Pour clarifier, ce dont j'ai besoin: P>
J'ai besoin d'une classe mémoireManager, qui a une méthode CreatestObject, qui crée une nouvelle testObject, le stocke Dans un vecteur ou un autre conteneur prenant en charge une itération rapide et renvoie une sorte de partage_ptr à l'objet nouvellement créé afin que l'objet qui nécessite une nouvelle testObject a une référence. P>
Maintenant, j'ai aussi besoin du partage_ptr Le testObject Pour pouvoir supprimer le testObject du conteneur Il est stocké dans, lorsque le dernier partage_ptr dépasse de la portée, de sorte que je ne suis pas laissé avec un vecteur rempli de testobjects non utilisés. P> P>
3 Réponses :
Il est difficile de savoir ce qui se passe à votre fin, car vous n'avez pas partagé le code qui initialise réellement à partir de là, Notez que ce ne fait pas t em> empêche le vecteur de relocaliser son stockage et de fabrication Pour l'enregistrement, essayez de construire un ... déclenchera nécessairement ub sur la ligne, puisque TestPointer code>. Mais ce que vous cherchez, c'est un aliased em>
std :: partagé_ptr code>:
Tespointer code> pointe vers le premier élément du vecteur, mais partage la propriété du vecteur lui-même avec
Testvector code>, fournissant la sémantique correcte. p>
TestPointer Code> Dangle si vous le faites réaffecter. P>
STD: : Shared_ptr code> possédant l'élément lui-même, comme suit: p>
std :: vecteur Code> a déjà une propriété unique de ses éléments, et il n'y a aucun moyen de pouvoir faire
std :: vecteur code> ou
std :: partagé_ptr code> renoncez-vous. p> p>
"J'essaie de comprendre ce qui se passe si vous créez un pointeur partagé, qui pointe vers un objet qui se tient dans un vecteur." P>
C'est une très mauvaise idée car la position de tout élément d'un vecteur peut changer simplement en ajoutant ou en supprimant un élément au vecteur. Ce que vous mettez en place, c'est simplement une duplication de la propriété qui freine les concepts de base des OOP. P>
L'objet est-il supprimé du vecteur? p> blockQuote>
Un pointeur partagé est le "propriétaire" de l'objet et le vecteur est également le propriétaire. Donc, c'est conceptionnel cassé! P>
Cela cause-t-il un comportement indéfini? p> blockQuote>
Il est toujours indéfini, car vous générez des points pendants, car le vecteur peut déplacer ses objets. P>
Comment puis-je atteindre le comportement que je veux si cela ne fonctionne pas? P> blockQuote>
Vous avez déjà accès rapide via
opérateur [] code> et vous avez déjà "pointeurs" car les itérateurs peuvent être utilisés comme tout autre pointeur. P>
Vous pouvez le faire en utilisant un Delier personnalisé avec votre partagé_ptr code> et à l'aide d'un conteneur comme
Boost :: Stable_vector Code>:
testVector.emplace_back();
auto it = V.end()-1;
auto deleter = [&testVector, it] (int*) {testVector.erase(it);};
std::shared_ptr<TestObject> ptr(&testVector.back(), deleter);
Vous manquez une partie du code? Parce que votre question n'est pas complètement claire pour moi
S'il vous plaît essayez de clarifier ce que vous avez réellement besoin.
Le pointeur partagé de IIRC doit-il que cela pointe, avez-vous vraiment détruit l'objet de vecteur lorsque la vie du pointeur expire? (Et puis lorsque la vie du vecteur expirera, il détruira déjà l'objet, UB)
Comment obtenez-vous
partagé_ptr code> à partir d'objets du
std :: vecteur code>? Les objets à l'intérieur code> TestVector code> appartiennent à ce
std :: vecteur code>. Si vous créez
partagé_ptr code> S avec adresses à celles-ci, vous n'allez certainement certainement pas causer de comportement non défini.
@uneven_mark Je crée l'objet dans le vecteur, puis obtenez l'adresse et créez un PTR partagé avec qui existe cependant un moyen d'archier le comportement souhaité cependant?
Pourquoi avez-vous un
partagé_ptr> code>? Avez-vous peut-être l'intention
vecteur code>?
Ce
std :: Shared_ptr> TestVector; code> ne correspond pas à ce que vous dites que vous voulez. Ça ressemble à ce que tu veux, c'est un vecteur de pointeurs intelligents non propriétaires
std :: vecteur> TestVector; code>.