faire shared_ptr pas utiliser de supprimer
dans mon code, je voudrais boost::shared_ptr de ne pas appeler delete mais appelez-ptr->deleteMe() à la place.
Aussi, j'ai un peu de C style des fonctions qui renvoient un pointeur. Puis-je faire appel lib_freeXYZ(ptr); au lieu d'essayer de les supprimer?
Vous devez vous connecter pour publier un commentaire.
Ou comment sur l'utilisation de la stl pour fournir de l'emballage du foncteur - Doug T. la description, mais sans la coutume de l'appelant.
Vous pouvez donner un shared_ptr modèle personnalisé deleter la fonction qui est la signature
pour un boost::shared_ptr
Donc pour la Deleter vous ne
ensuite dans le corps de la Deleter:
Pour votre cas particulier lorsque vous avez besoin de quelque chose de simple (comme ptr->deleteMe) voir Greg de la solution, son très agréable.
ptr != 0
avant d'être déréférencé dans la deleter. Au moins, j'ai trouvé que c'était le cas en utilisant std::tr1::shared_ptr sur gcc 4.4.5.delete ptr
est un peu déroutant, ici, c'est comme vous voulez supprimer l'objet deux fois (d'abord avecptr->deleteMe()
). Je pense que normalement vous devriez utiliser un deleter parce que vous voulez faire quelque chose de au lieu dedelete ptr
, pas de à.void Deleter( T* ptr);
<-- ici )Doug T. répondu à votre question bien. Je vais vous parler de intrusive_ptr. Peut-être que vous pouvez l'utiliser dans votre projet de trop.
Si vous avez une bibliothèque C qui a déjà de comptage de référence, mais vous devez manuellement à l'appel de ces fonctions, vous pouvez utiliser
boost::intrusive_ptr
trop, et de fournir des définitions requises pour son add_ref et la libération des fonctions. intrusive_ptr trouverez et de les appeler. Ils sont responsables pour incrémenter le compteur de référence et de décrémentation, libérant la ressource lors de la necassary:Alors vous pouvez simplement créer des objets à partir de matières de pointeurs de type
foo*
. intrusive_ptr fera appel à vos fonctions lors de son copié/détruits:Pour le style C données, procédez comme @Doug. T a suggéré.
Pour votre classe, pourquoi ne pas faire le nettoyage dans un destructeur? Même si cela est notamment deleteMe() dans le destructeur.