2010-12-01 12 views
6

Soy nuevo en shared_ptr. Tengo algunas preguntas con respecto a la sintaxis de C++ 0x shared_ptr de la siguiente manera:Pregunta de sintaxis básica para 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"; 

Respuesta

0

tratar 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(); 

Editar: Sólo para resumir qué make_shared se prefiere a una llamada explícita a new:

  1. ¿Alguna (¿todas?) Implementaciones utilizan una asignación de memoria para el objeto construido y el contador/eliminador. Esto aumenta el rendimiento.

  2. Es seguro excepción, considere una función de tomar dos shared_ptrs:

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

    Dado que el orden de evaluación no se define, una posible evaluación puede ser: construir una, construir B, inicializar share_ptr<A>, inicializar shared_ptr<B>. Si B arroja, tendrá fugas A.

  3. Separación de responsabilidad. Si shared_ptr es responsable de la eliminación, hazlo responsable de la asignación también.

+0

¿Por qué se make_shared mejor aquí? –

+2

@Fred: separación de responsabilidad. 'make_shared <>' permite que la biblioteca maneje el 'new', por lo que su código no muestra una invocación 'new' aparentemente desequilibrada. La biblioteca hace el 'delete', por lo que debería hacer el' new' también. –

+0

@Fred Nurk: 'make_shared' puede eliminar una asignación. – ybungalobill

0

¿Cómo podría crear un nuevo objeto a asignarlo a puntero compartido?

Usted tiene que "reset" el puntero compartida:

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

cómo podría asignar NULL nuevo para ptr3 de manera que si la declaración de abajo se convierte en verdad?

Una vez más, mediante el uso de reinicio, pero sin argumentos (o nula)

ptr3.reset(); 
Cuestiones relacionadas