¿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
Itachi Uchiwa 13 dic. 2019 a las 01:12

2 respuestas

La mejor respuesta

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 último shared_ptr que lo posee, y r 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.

2
ShadowRanger 14 dic. 2019 a las 02:02

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.

0
zig razor 14 dic. 2019 a las 01:39