¿Es seguro autoasignarse un std::shared_ptr
? Entonces, aquí hay un ejemplo:
std::shared_ptr<std::vector<std::string>> pVec = std::make_shared<std::vector<std::string>>();
std::cout << pVec.use_count() << std::endl; // 1
pVec = pVec;
Sé que asignar un objeto shared_ptr
:
- disminuirá el recuento de referencia de operando (RC) del lado izquierdo (LHS), y luego verificará si es 0 (estas operaciones anteriores se realizan atómicamente) y si es así, libere el recurso;
- además, incrementará el RC del lado derecho (RHS).
Entonces, en este ejemplo, el objeto es el mismo tanto en LHS como en RHS, y el orden de estos dos cambios RC dentro del operador de asignación no está especificado.
Realmente no sé qué sucede exactamente en caso de autoasignación.
2 respuestas
Por los documentos de cppreference en shared_ptr
's {{X1} } (énfasis agregado):
Reemplaza el objeto administrado con el administrado por
r
.Si
*this
ya posee un objeto y es el últimoshared_ptr
que lo posee, yr
no son lo mismo que*this
, el objeto es destruido a través del delegador de propiedad.
Básicamente, ya pensaron en esta posibilidad, y se requiere la implementación para manejar este caso; la autoasignación no elimina el objeto, incluso si es el único propietario del objeto.
La autoasignación está permitida y es seguro hablar de pérdida de memoria. De hecho, ninguna documentación y prueba con valgrind muestran que la autoasignación de punteros compartidos produzca una pérdida de memoria.
Preguntas relacionadas
Nuevas preguntas
c++
C ++ es un lenguaje de programación de propósito general. Originalmente fue diseñado como una extensión de C y tiene una sintaxis similar, pero ahora es un lenguaje completamente diferente. Utilice esta etiqueta para preguntas sobre el código (a ser) compilado con un compilador C ++. Utilice una etiqueta de versión específica para preguntas relacionadas con una revisión estándar específica [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] o [C ++ 23], etc. .