Esto último siempre da como resultado una mejor ubicación y reduce la fragmentación de la memoria.
No siempre. Se recomienda que una implementación use una única asignación para el objeto contado de referencia y el recuento de referencia, pero no es requerido para hacerlo.
¿Por qué no quieres usar std::make_shared
? Considere el caso donde tiene un objeto grande dinámicamente asignado que quiere que sea propiedad de std::shared_ptr
y sabe que habrá referencias débiles a este objeto que probablemente sobrevivirán a las fuertes referencias al objeto (quizás haya muchas referencias débiles y solo una o dos referencias fuertes efímeras). En este caso, std::make_shared
sería una mala elección, suponiendo que asigna un único bloque que posee tanto el objeto como el recuento de referencia: el bloque asignado (que es grande, recuerde) no puede destruirse hasta que no haya referencias débiles dejados al objeto.
Si va a asignar dinámicamente el objeto usted mismo y pasar el puntero al constructor std::shared_ptr
, la memoria ocupada por el objeto podría liberarse tan pronto como no queden referencias fuertes, incluso si todavía hay referencias débiles.
Supongo que consideraría convertir de 'std :: unique_ptr' para interactuar con punteros crudos? Porque creo que este es el tipo canónico que se devolverá de las funciones de fábrica. ¿Qué otros punteros se considerarían "punteros crudos" y tienen un lugar en el C++ moderno después de todo? –