2012-07-01 15 views
12
class MyClass { 
public: 
    MyClass(std::weak_ptr<MyClass> parent){} 
} 

quiero hacer esto:por qué no puedo echar a nullptr weak_ptr <>

auto newInstance = std::make_shared<MyClass>(nullptr); 

o valor predeterminado de argumento weak_ptr es nulo, como por ejemplo:

void function(int arg,std::weak_ptr<MyClass> obj = nullptr); 

pero , lo que necesito es hacer esto en su lugar:

auto newInstance = std::make_shared<MyClass>(std::shared_ptr<MyClass>(nullptr)); 

¿por qué es eso?

+0

BTW, la próxima vez, también incluye los errores del compilador en su pregunta – akappa

Respuesta

23

Porque un weak_ptr en concepto solo se puede construir desde otro weak_ptr o shared_ptr. Simplemente no tiene sentido construir desde un puntero sin formato, ya sea nullptr o no.

Puede utilizar un defecto construido weak_ptr (std::weak_ptr<MyClass>()) en el que está intentando utilizar nullptr:

auto newInstance = std::make_shared<MyClass>(std::weak_ptr<MyClass>()); 
void function(int arg,std::weak_ptr<MyClass> obj = std::weak_ptr<MyClass>()); 
+1

'nullptr' tiene un tipo especial' nullptr_t' por lo que los punteros crudos no se pueden convertir implícitamente a 'nullptr_t'. Por lo tanto, no veo ningún motivo para prohibir 'weak_ptr (nullptr)'. – magras

+0

@magras Escribí esta respuesta hace años, y estoy de acuerdo con usted. Fundamentalmente, tiene sentido que un puntero débil necesite estar asociado a un shared_ptr o no asociado. Obviamente, el comité de normas decidió que nullptr no transmitía no asociado ni construido por defecto. – David

-1

propósito principal de un puntero débil es por lo general para saber si un objeto que podría ser destruido por otro código aún existe . ¿Cómo podría un puntero débil construido a partir de un puntero común saber si el objeto aún existe? ¿Puedes imaginar una forma en que esto podría funcionar?

+4

Me lo puedo imaginar, creo. Muy fácilmente. :) – Kos

+0

"El único propósito de un puntero débil es saber si un objeto que podría ser destruido por otro código aún existe" es una afirmación poco confusa. Yo diría que esto es una facilidad de weak_ptr. El propósito de los punteros inteligentes es automatizar la administración de la memoria. Además hay algunas más facilidades de weak_ptr: (1) como dijiste observando el objeto sin influencia en su tiempo de vida (2) previniendo los llamados "ciclos de retención" (cuando hay un círculo de objetos haciendo referencia entre ellos con puntero compartido manteniendo así todo objetos vivos y que causan pérdidas de memoria) (3) pueden referirse al objeto puntiagudo que devuelve shared_ptr. –

+1

¿Qué tal si quiere que el weak_ptr se construya automáticamente en nullptr en el constructor? Ahí es cuando necesito esta funcionalidad. – Andrew

Cuestiones relacionadas