Question

J'ai un problème de "Les extensions bibliothèque standard C ++":

  

Exercice 6
  Je l'ai dit dans la section 2.4.2   que vous ne devriez pas construire deux   shared_ptr objets du même   aiguille. Le danger est que les deux   objets shared_ptr ou leurs descendants   finira par essayer de supprimer le   ressources, et qui conduit généralement à   difficulté. En fait, vous pouvez le faire si   vous faites attention. Il est pas particulièrement   utile, mais écrire un programme qui   deux constructions   objets de shared_ptr   le même pointeur et supprime la   ressource qu'une seule fois.

ci-dessous est ma réponse:

template <typename T>
void nonsence(T*){}
struct SX {
     int data;
     SX(int i = 0) :
              data(i) {
              cout << "SX" << endl;
     }
     ~SX() {
              cout << "~SX" << endl;
     }
};
int main(int argc, char **argv) {
    SX* psx=new SX;
    shared_ptr<SX> sp1(psx),sp2(psx,nonsence<SX>);
    cout<<sp1.use_count()<<endl;
    return 0;
}

mais je ne pense pas que ce soit une bonne solution - parce que je ne veux pas le résoudre par le constructeur d'utilisation. quelqu'un peut me donner une meilleure? thx, pardonne mon mauvais anglais.

Était-ce utile?

Autres conseils

Tout ce que vous devez faire est de construire à partir du premier second shared_ptr <=>.

shared_ptr<SX> sp1( new SX );
shared_ptr<SX> sp2( sp1 );

Le SX créé sera alors correctement supprimé que lorsque tous les pointeurs partagés à celui-ci sont détruits.

L'astuce que vous avez trouvé est valide, mais inutile. La principale caractéristique de comptage est shared_ptr de référence qui vous subvertir ici. Le Deleter (le deuxième argument du constructeur) est là pour l'utilisation des ressources autres <=> puis pointeurs simples. Vous pouvez l'utiliser avec des fichiers, par exemple:


typedef boost::shared_ptr FilePtr;
void FileClose( FILE* pf ) { if ( pf ) fclose( pf ); }
FilePtr pfile( fopen( "filename" ), FileClose );

Même avec des connexions de base de données, prises, etc., etc., et RAII en général.

Vous pouvez voir comment il résout avec boost shared_from_this . Voici le .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top