Solo una pequeña consulta al respecto shared_ptr.
¿Es una buena práctica usar shared_ptrseñ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_ptrse puede usar para administrar una matriz asignada dinámicamente. Elshared_ptrargumento 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_typeahora se define comoSe puede acceder a los elementos de la matriz utilizando
operator[]Antes de C ++ 17 ,
shared_ptrpodría no ser utilizado para administrar matrices dinámicamente asignados. Por defecto,shared_ptrllamarádeleteal 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_ptrcon una matriz, debe proporcionar un eliminador personalizado.Cree el shared_ptr de la siguiente manera:
Ahora
shared_ptrllamará correctamentedelete[]al destruir el objeto administrado.El eliminador personalizado anterior puede ser reemplazado por
la
std::default_deleteespecialización parcial para tipos de matrizuna expresión lambda
Además, a menos que realmente necesite compartir la responsabilidad del objeto administrado, a
unique_ptres 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_ptrpara permitirle trabajar de forma inmediata para los casos en que posee una matriz de objetos. El borrador actual de losshared_ptrcambios programados para este TS se puede encontrar en N4082 . Se podrá acceder a estos cambios a través delstd::experimentalespacio de nombres y se incluirán en el<experimental/memory>encabezado. Algunos de los cambios relevantes para soportarshared_ptrmatrices son:- La definición del tipo de miembro
element_typecambia- Miembro
operator[]agregado- A diferencia de la
unique_ptrespecializació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::getdevuelve 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_ptrobtiene esa especialización parcial peroshared_ptrno la obtiene ?Una alternativa posiblemente más fácil que podría usar es
shared_ptr<vector<int>>.fuente
shared_ptr<array<int, 6>>.