2010-08-15 5 views
4

J'ai un code qui utilise des pointeurs bruts partout.Interface C++ entre pointeurs bruts et shared_ptr

Il doit appeler une méthode qui prend le pointeur brut dans un shared_ptr. Cette méthode n'est pas sous mon contrôle, appartenant à une API externe. Je ne peux pas simplement passer le pointeur sur le shared_ptr parce que quand il sera supprimé quand le shared_ptr sort de la portée dans la méthode (quand la méthode retourne). Est-ce que j'ai une autre option que de rendre mon pointeur brut shared_ptr dans mon code interne?

+0

Pourquoi votre code utilise-t-il des pointeurs bruts? – GManNickG

+0

Ce n'est pas mon code. C'est le code de l'entreprise que je possède/entretient maintenant. Est-ce un objectif intéressant de déplacer les pointeurs vers shared_ptrs? Des avis ? – user231536

+0

@user: Cela dépend de votre situation. Si vous pouviez rendre le code plus sûr, plus rapide et plus propre, et avoir le temps, vous devriez corriger tout le code. Mais parfois vous avez juste besoin de courir avec ce que vous avez et de l'améliorer à partir de là. En d'autres termes, concentrez-vous sur ce que vous devez faire, et quand vous avez le temps de corriger et de mettre à jour le vieux code brisé. (À moins, bien sûr, que vous ne puissiez pas continuer * parce que * le code est cassé avec des pointeurs bruts, alors évidemment le corriger.) – GManNickG

Répondre

10

Cela semble un peu inhabituel et potentiellement très dangereux, mais vous pouvez accomplir cela en utilisant un no-op Deleter lors de la construction du shared_ptr:

struct no_op_delete 
{ 
    void operator()(void*) { } 
}; 

int* p = 0; // your pointer 
std::shared_ptr<int> sp(p, no_op_delete()); 

Lorsque sp et toutes les copies qui ont été faites de celui-ci ont été détruits , no_op_delete sera invoqué pour nettoyer le pointeur maintenu. Comme cela ne fait rien, vous obtenez le comportement dont vous avez besoin.

+0

James McNellis ne dort jamais xD. –

+0

@Prasoon: Le sommeil ne fait que perdre du temps je pourrais autrement passer la programmation. –

+0

Hehe, alors vous devriez lire http://serendip.brynmawr.edu/exchange/node/1690 :-) –

1

James avait déjà répondu à la question. Donc, c'est simplement une suggestion. Si vous savez que l'appel de fonction ne modifie pas l'objet (comme la configuration de certains membres de données, etc.), vous pouvez créer un nouvel objet à partir de votre pointeur brut et le transmettre via un shared_ptr à la fonction. De cette façon, vous supposez que la fonction prend possession de l'objet et fait tout ce qui est requis. Bien sûr, cela ne fonctionne pas si la fonction va modifier l'objet. Cela peut fonctionner si la fonction utilise l'objet en lecture seule pour effectuer une autre opération (comme par exemple une E/S de fichier)