Solo una pequeña consulta al respecto shared_ptr
.
¿Es una buena práctica usar shared_ptr
señalar a una matriz? Por ejemplo,
shared_ptr<int> sp(new int[10]);
Si no, ¿por qué no? Una razón por la que ya estoy al tanto es que uno no puede aumentar / disminuir el shared_ptr
. Por lo tanto, no se puede usar como un puntero normal a una matriz.
c++
c++11
shared-ptr
tshah06
fuente
fuente
std::vector
. Tendría que tener cuidado de pasar la matriz usando referencias para no hacer copias de ella. La sintaxis para acceder a los datos es más limpia que shared_ptr, y cambiar su tamaño es muy fácil. Y obtienes toda la bondad STL si alguna vez la quieres.std::array
. Es casi lo mismo que una matriz en bruto, pero con una semántica adecuada para usar en la mayoría de los componentes de la biblioteca. Especialmente los objetos de ese tipo se destruyen condelete
, nodelete[]
. Y a diferenciavector
, almacena los datos directamente en el objeto, por lo que no obtiene una asignación adicional.Respuestas:
Con C ++ 17 ,
shared_ptr
se puede usar para administrar una matriz asignada dinámicamente. Elshared_ptr
argumento de plantilla en este caso debe serT[N]
oT[]
. Entonces puedes escribirDesde n4659, [util.smartptr.shared.const]
Para admitir esto, el tipo de miembro
element_type
ahora se define comoSe puede acceder a los elementos de la matriz utilizando
operator[]
Antes de C ++ 17 ,
shared_ptr
podría no ser utilizado para administrar matrices dinámicamente asignados. Por defecto,shared_ptr
llamarádelete
al objeto administrado cuando no queden más referencias a él. Sin embargo, cuando asigna utilizandonew[]
debe llamardelete[]
, y nodelete
, para liberar el recurso.Para usar correctamente
shared_ptr
con una matriz, debe proporcionar un eliminador personalizado.Cree el shared_ptr de la siguiente manera:
Ahora
shared_ptr
llamará correctamentedelete[]
al destruir el objeto administrado.El eliminador personalizado anterior puede ser reemplazado por
la
std::default_delete
especialización parcial para tipos de matrizuna expresión lambda
Además, a menos que realmente necesite compartir la responsabilidad del objeto administrado, a
unique_ptr
es más adecuado para esta tarea, ya que tiene una especialización parcial para los tipos de matriz.Cambios introducidos por las extensiones de C ++ para los fundamentos de la biblioteca
Otra especificación anterior a C ++ 17 a las enumeradas anteriormente fue proporcionada por la Especificación técnica de los fundamentos de la biblioteca , que aumentó
shared_ptr
para permitirle trabajar de forma inmediata para los casos en que posee una matriz de objetos. El borrador actual de losshared_ptr
cambios programados para este TS se puede encontrar en N4082 . Se podrá acceder a estos cambios a través delstd::experimental
espacio de nombres y se incluirán en el<experimental/memory>
encabezado. Algunos de los cambios relevantes para soportarshared_ptr
matrices son:- La definición del tipo de miembro
element_type
cambia- Miembro
operator[]
agregado- A diferencia de la
unique_ptr
especialización parcial para matrices, tantoshared_ptr<T[]>
yshared_ptr<T[N]>
será válida y ambos se traducirá endelete[]
ser llamado en la matriz administrada de objetos.fuente
shared-array
.shared_ptr::get
devuelve un puntero al objeto gestionado. Para que pueda usarlo comosp.get()[0] = 1; ... sp.get()[9] = 10;
std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );
ver también en.cppreference.com/w/cpp/memory/default_deletestd::shared_ptr<std::array<int,N>>
debería ser suficiente.unique_ptr
obtiene esa especialización parcial peroshared_ptr
no la obtiene ?Una alternativa posiblemente más fácil que podría usar es
shared_ptr<vector<int>>
.fuente
shared_ptr<array<int, 6>>
.