2010-12-01 6 views
6

Je suis nouveau dans shared_ptr. J'ai quelques questions concernant la syntaxe de C++ 0x shared_ptr comme ci-dessous:Question de syntaxe de base pour shared_ptr

//first question 
shared_ptr<classA>ptr(new classA()); //works 
shared_ptr<classA>ptr; 
ptr = ?? //how could I create a new object to assign it to shared pointer? 


//second question 
shared_ptr<classA>ptr2; //could be tested for NULL from the if statement below 
shared_ptr<classA> ptr3(new classA()); 
ptr3 = ?? //how could I assign NULL again to ptr3 so that the if statement below becomes true? 

if(!ptr3) cout << "ptr equals null"; 

Répondre

0

essayer ptr3.reset(NULL)

10
shared_ptr<classA> ptr; 
ptr = shared_ptr<classA>(new classA(params)); 
// or: 
ptr.reset(new classA(params)); 
// or better: 
ptr = make_shared<classA>(params); 

ptr3 = shared_ptr<classA>(); 
// or 
ptr3.reset(); 

Edit: Pour résumer pourquoi make_shared est préférable à un appel explicite à new:

  1. Certaines implémentations (toutes?) Utilisent une allocation de mémoire pour l'objet construit et le compteur/suppresseur. Cela augmente les performances.

  2. Il est exception en toute sécurité, envisager une fonction qui prend deux shared_ptrs:

    f(shared_ptr<A>(new A), shared_ptr<B>(new B)); 
    

    Depuis l'ordre d'évaluation n'est pas définie, une évaluation possible peut être: construire A, construire B, initialisez share_ptr<A>, initialiser shared_ptr<B>. Si B jette, vous fuire A.

  3. Séparation des responsabilités. Si shared_ptr est responsable de la suppression, assurez-vous également de la répartition.

+0

Pourquoi make_shared mieux ici? –

+2

@Fred: Séparation des responsabilités. 'make_shared <>' permet à la bibliothèque de gérer le 'new', donc votre code n'affiche pas une invocation' new' apparemment déséquilibrée. La bibliothèque fait le 'delete', donc il devrait aussi faire le' new'. –

+0

@Fred Nurk: 'make_shared' peut potentiellement éliminer une allocation. – ybungalobill

0

comment pourrais-je créer un nouvel objet à assigner à pointeur partagé?

Vous devez "réinitialiser" le pointeur partagé:

classA* my_pointer = new classA(); 
shared_ptr<classA>ptr; 
ptr.reset(my_pointer); 

comment pourrais-je attribuer à nouveau NULL ptr3 de telle sorte que l'instruction if est vrai ci-dessous?

Encore une fois, en utilisant remise à zéro mais sans argument (ou nul)

ptr3.reset();