0
votes

Pointeur partagé à un objet dans un vecteur

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;
};
  • L'objet est-il supprimé du vecteur? li>
  • Cela cause-t-il un comportement indéfini? LI>
  • Comment puis-je archier le comportement que je veux si cela ne fonctionne pas? LI> ul>

    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>


7 commentaires

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 à partir d'objets du std :: vecteur ? Les objets à l'intérieur TestVector appartiennent à ce std :: vecteur . Si vous créez partagé_ptr 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 > ? Avez-vous peut-être l'intention vecteur ?


Ce std :: Shared_ptr > TestVector; 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; .


3 Réponses :


0
votes

Il est difficile de savoir ce qui se passe à votre fin, car vous n'avez pas partagé le code qui initialise réellement TestPointer . Mais ce que vous cherchez, c'est un aliased std :: partagé_ptr : xxx

à partir de là, Tespointer pointe vers le premier élément du vecteur, mais partage la propriété du vecteur lui-même avec Testvector , fournissant la sémantique correcte.

Notez que ce ne fait pas t empêche le vecteur de relocaliser son stockage et de fabrication TestPointer Dangle si vous le faites réaffecter.

Pour l'enregistrement, essayez de construire un STD: : Shared_ptr possédant l'élément lui-même, comme suit: xxx

... déclenchera nécessairement ub sur la ligne, puisque std :: vecteur a déjà une propriété unique de ses éléments, et il n'y a aucun moyen de pouvoir faire std :: vecteur ou std :: partagé_ptr renoncez-vous.


0 commentaires

0
votes

"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."

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.

L'objet est-il supprimé du vecteur?

Un pointeur partagé est le "propriétaire" de l'objet et le vecteur est également le propriétaire. Donc, c'est conceptionnel cassé!

Cela cause-t-il un comportement indéfini?

Il est toujours indéfini, car vous générez des points pendants, car le vecteur peut déplacer ses objets.

Comment puis-je atteindre le comportement que je veux si cela ne fonctionne pas?

Vous avez déjà accès rapide via opérateur [] et vous avez déjà "pointeurs" car les itérateurs peuvent être utilisés comme tout autre pointeur.


0 commentaires

0
votes

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);


0 commentaires