construire deux objets shared_ptr du même pointeur
-
22-08-2019 - |
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.
La solution 4
Je suis la réponse "STANDARD" de boost doc: http: // www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp
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 .