ya hay un par de preguntas sobre este tema, pero todavía no estoy seguro de qué hacer: nuestra base de código usa shared_ptr
en muchos lugares. Tengo que admitir que no definimos la propiedad claramente al escribirla.¿Debo convertir shared_ptr en weak_ptr cuando se pasa a un método?
Tenemos algunos métodos como
void doSomething(shared_ptr<MyClass> ptr)
{
//doSomething() is a member function of a class, but usually won't store the ptr
ptr->foo();
...
}
Después de haber descubierto los primeros (indirectos) dependencias circulares que me gustaría corregir los errores en nuestro diseño. Pero no estoy exactamente seguro de cómo. ¿Hay algún beneficio en cambiar el método de arriba a
void doSomething(weak_ptr<MyClass> ptr)
{
shared_ptr<MyClass> ptrShared = ptr.lock();
ptrShared->foo();
...
}
?
También estoy confundido porque algunas personas dicen (incluida la Guía de estilo de Google) que en primer lugar es importante obtener la propiedad correcta (lo que probablemente significaría la introducción de muchos weak_ptrs
, por ejemplo en el ejemplo con los métodos anteriores, pero también para muchas variables miembro que tenemos). Otros dicen (ver enlaces a continuación) que debe usar weak_ptr para romper dependencias cíclicas. Sin embargo, detectarlos no siempre es fácil, entonces me pregunto si realmente debería usar shared_ptr hasta que me encuentre con problemas (y me dé cuenta de ellos), y luego los solucione.
Gracias por su opinión!
Ver también
- shared_ptr and weak_ptr differences
- boost::shared_ptr cycle break with weak_ptr
- boost, shared ptr Vs weak ptr? Which to use when?
Sería shared_ptr & ptr ser mejor? –
DanDan
"detectarlos no siempre es fácil" - entonces realmente necesita agregar más pasos a su proceso de diseño. Líneas claras y oscuras en sus diagramas de relación de clase, o lo que sea necesario. También puede considerar romper ciclos con punteros crudos en lugar de punteros débiles, para la mayoría de las relaciones asimétricas donde el "propietario" nunca será destruido antes que todos los "no propietarios". –
@DanDan: No lo creo, consulte http://stackoverflow.com/questions/327573/c-passing-references-to-boostshared-ptr – Philipp