La página cplusplus.comshared_ptr
hace una distinción entre un vacío std::shared_ptr
y un nulo shared_ptr
. La página cppreference.com no menciona explícitamente la distinción, pero usa tanto "vacío" como comparación nullptr
en su descripción del std::shared_ptr
comportamiento.
¿Hay alguna diferencia entre un vacío y un nulo shared_ptr
? ¿Existe algún caso de uso para tales punteros de comportamiento mixto? ¿Tiene sentido un nulo no vacío shared_ptr
? ¿Habría alguna vez un caso en el uso normal (es decir, si no construyó uno explícitamente) en el que podría terminar con un vacío pero no nulo shared_ptr
?
¿Y alguna de estas respuestas cambia si está usando la versión Boost en lugar de la versión C ++ 11?
fuente
shared_ptr
instancia vacía con un puntero almacenado no NULL". También vale la pena mencionar la nota anterior (p15), "Para evitar la posibilidad de un puntero colgando, el usuario de este constructor debe asegurarse de quep
sigue siendo válido al menos hasta quer
se destruya el grupo de propiedad de ". De hecho, una construcción poco utilizada.shared_ptr
cuyosget()
rendimientosnullptr
se comparan igual anullptr
independientemente de si posee algo.shared_ptr
s pueden ser útiles, para asegurarse de alguna función es ejecutada una vez que todos los punteros que poseen ejecutan fuera de alcance (incluso en caso de una excepción!). No estoy seguro de si ahora hay una clase especial para esto.shared_ptr
que noshared_ptr
pueda hacer un no nulo y no vacío ?r
" a la frase "posee todo lo quer
posee"¿Hay alguna diferencia entre un shared_ptr vacío y uno nulo?
Empty
shared_ptr
no tiene bloque de control y su recuento de uso se considera 0. La copia de emptyshared_ptr
es otro vacíoshared_ptr
. Ambos son correosshared_ptr
electrónicos separados que no comparten un bloque de control común porque no lo tienen. Emptyshared_ptr
se puede construir con el constructor predeterminado o con el constructor que tomanullptr
.El nulo no vacío
shared_ptr
tiene un bloque de control que se puede compartir con otrosshared_ptr
s. La copia de nulo no vacíoshared_ptr
esshared_ptr
que comparte el mismo bloque de control que el original,shared_ptr
por lo que el recuento de uso no es 0. Se puede decir que todas las copias deshared_ptr
comparten lo mismonullptr
. Seshared_ptr
puede construir un nulo no vacío con un puntero nulo del tipo de objeto (nonullptr
)He aquí un ejemplo:
#include <iostream> #include <memory> int main() { std::cout << "std::shared_ptr<int> ptr1:" << std::endl; { std::shared_ptr<int> ptr1; std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl; std::shared_ptr<int> ptr2 = ptr1; std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl; std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl; } std::cout << std::endl; std::cout << "std::shared_ptr<int> ptr1(nullptr):" << std::endl; { std::shared_ptr<int> ptr1(nullptr); std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl; std::shared_ptr<int> ptr2 = ptr1; std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl; std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl; } std::cout << std::endl; std::cout << "std::shared_ptr<int> ptr1(static_cast<int*>(nullptr))" << std::endl; { std::shared_ptr<int> ptr1(static_cast<int*>(nullptr)); std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl; std::shared_ptr<int> ptr2 = ptr1; std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl; std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl; } std::cout << std::endl; return 0; }
Produce:
std::shared_ptr<int> ptr1: use count before copying ptr: 0 use count after copying ptr: 0 ptr1 is null std::shared_ptr<int> ptr1(nullptr): use count before copying ptr: 0 use count after copying ptr: 0 ptr1 is null std::shared_ptr<int> ptr1(static_cast<int*>(nullptr)) use count before copying ptr: 1 use count after copying ptr: 2 ptr1 is null
http://coliru.stacked-crooked.com/a/54f59730905ed2ff
fuente