2011-12-24 5 views
24

A menudo necesito tratar arreglos asignados dinámicamente en C++, y por lo tanto confío en Boost para scoped_array, shared_array, y similares. Después de leer Stroustrup's C++11 FAQ y C++11 Reference Wiki, no pude encontrar un reemplazo adecuado para estas envolturas de matriz dinámica que proporciona el estándar C++ 11. ¿Hay algo que haya pasado por alto, o tengo que seguir confiando en Boost?¿Tiene C++ 11 envoltorios para matrices asignadas dinámicamente como scoped_array de Boost?

¡Muchas gracias por su ayuda!

Respuesta

43

Hay una especialización de unique_ptr, como unique_ptr<T[]>.

#include <iostream> 
#include <memory> 

struct test 
{ 
    ~test() { std::cout << "test::dtor" << std::endl; } 
}; 

int main() 
{ 
    std::unique_ptr<test[]> array(new test[3]); 
} 

Cuando lo ejecute, recibirá este mensaje.

test::dtor 
test::dtor 
test::dtor 

Si desea utilizar shared_ptr, se debe utilizar para std::default_delete<T[]> Deleter ya que no tiene uno como shared_ptr<t[]>.

std::shared_ptr<test> array(new test[3], std::default_delete<test[]>()); 
+0

¡Gracias, justo lo que estaba buscando! No tenía idea de que había una especialización para las matrices. –

0

Por lo que se pretende que sean vectores envoltorios de matriz, lo que si se usa cualquier puntero inteligente adecuado con el vector como objeto interno?

+0

vector :: emplace_back() y vector :: push_back() no funcionarán si el tipo de elemento no es copiable. No sé sobre la inicialización con una lista de inicializadores, pero sospecho que tiene el mismo problema. – Syncopated

+0

Sí, tienes razón, en ese caso tenemos que envolver las cosas que no se pueden copiar con un envoltorio adicional, que tiende a ser un exceso en realidad :) –

Cuestiones relacionadas