2009-05-16 6 views
3

J'ai un problème de « Les extensions bibliothèque standard C++ »:construire deux objets shared_ptr du même pointeur

Exercice 6
je l'ai dit à la section 2.4.2 que vous ne devriez pas construire deux objets shared_ptr du même pointeur . Le danger est que les deux objets shared_ptr ou leur progéniture essaieront éventuellement de supprimer la ressource , ce qui entraîne généralement un problème . En fait, vous pouvez le faire si vous êtes prudent. Ce n'est pas particulièrement utile, mais écrivez un programme qui construit deux objets shared_ptr de le même pointeur et supprime la ressource 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-il m'en donner un meilleur? thx, pardonnez mon mauvais anglais.

+0

Il vous manque un "{" dans le constructeur SX. (Juste pour être pédant) –

Répondre

1

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

+0

thx beaucoup. Je suis trouve que booster ce problème par ceci: http: //www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp. presque le même que le mien. merci encore. – cnheying

2

L'astuce que vous avez trouvée est valide, bien qu'inutile. La caractéristique centrale de shared_ptr est le comptage de références, que vous subvertissez ici. Le deleter (l'argument du second constructeur) est là pour utiliser shared_ptr avec des ressources autres que des 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.

3

Tout ce que vous devez faire est de construire le second shared_ptr du premier shared_ptr. Le SX créé ne sera supprimé correctement que lorsque tous les pointeurs partagés seront détruits.

Questions connexes