2009-11-11 13 views
13

¿Está boost::make_shared obsoleto ahora? No he encontrado su definición en 1.35.¿Boost :: make_shared está obsoleto ahora?

+1

Irónicamente, la mayoría de las personas que vienen aquí ahora probablemente se estén preguntando (como yo) si es obsoleto porque está en C++ 11. (Respuesta corta: sí, puede usar std :: versions.) – patrickvacek

+0

... a menos que necesite mantener la compatibilidad con las plataformas anteriores a C++ 11, en cuyo caso los punteros inteligentes de Boost son un * realmente * buen beneficio. – DevSolar

Respuesta

12

Está en los documentos: 1.4 http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/make_shared.html

Parece haber sido añadido en la versión 1.39

+0

Gracias Ryan. ¿Hay alguna forma de averiguar qué versión se ha introducido? – Steve

+0

El doc. Smart_ptr tiene una sección de historia que puede ayudarlo a encontrar lo que necesita: http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/smart_ptr.htm#History –

+7

es incluso parte de C++ 0x –

2

hizo un poco de investigación hoy en día, y parece que make_shared realidad se añadió a 1.36.0 (en 1,35 .0 no existe dicho encabezado), pero lo interesante es que no hay una sola mención en Novedades sobre este cambio - al menos no lo pude encontrar

26

std :: make_shared también está disponible en C++ 11 . Tenga en cuenta que make_shared es más que una función de conveniencia. En el siguiente ejemplo:

make_shared<foobar>(1, 2); 
shared_ptr<foobar>(new foobar(1, 2)); 

Ambas declaraciones crear un objeto foobar y construir un shared_ptr. Sin embargo, el primero evita una asignación de memoria para el contador compartido, porque se usará un único fragmento de memoria para el contador y el objeto foobar. Esto no es posible con la última declaración, porque la memoria para foobar se asigna antes de que se construya el shared_ptr.

Lo que quiero decir: No, make_shared no es obsoleto, ya que proporciona una optimización muy útil.

+7

En C++ 11, '' std :: make_shared'' es en realidad una optimización del rendimiento sobre la creación de un objeto, y luego se crea '' std :: shared_ptr'', porque solo funciona una asignación de memoria en lugar de dos. – Sean

+2

Otra diferencia importante es la seguridad de hilos. En el segundo ejemplo, 'shared_ptr' 'ctor puede arrojar mientras que foobar asignado por el nuevo anidado no será liberado. –