2011-07-15 27 views
33

¿Cómo manejan los punteros inteligentes las matrices? Por ejemplo,punteros y matrices inteligentes

void function(void) 
{ 
    std::unique_ptr<int> my_array(new int[5]); 
} 

Cuando my_array sale del ámbito y obtiene destructed, se vuelve a re-afirmó toda la matriz entera? ¿Solo se reclama el primer elemento de la matriz? ¿O hay algo más en juego (como un comportamiento indefinido)?

Respuesta

63

Se llamará delete[] y por lo tanto todo el conjunto será recuperado, pero creo que usted necesita para indicar que se está utilizando un formulario de matriz de unique_ptr por:

std::unique_ptr<int[]> my_array(new int[5]); 

Esto se conoce como especialización parcial de el unique_ptr.

+19

Trivia: Aquí es donde se inventó esta sintaxis: http://groups.google.com/group/comp.lang.c++/browse_thread/thread/469fcc136b8f2d42/59c0491245293db7?q=%3Cchar%5B%5D%3E+ grupo: comp.lang.c% 2B% 2B + autor: hinnant –

+5

@Howard Hinnant: Gracias por la trivia, no lo sabía. ¡Tú eres el que lo inventó, en el año 2001! Eso es genial tenerlo aquí :) –

+0

Ese es también el único método que tiene algún sentido, considere 'typedef int (three_ints) [3]; plantilla función de vacío (vacío) {unique_ptr p (nuevo T); } función (); ' –

2

Editar: Esta respuesta no era correcta, como se explica en los comentarios a continuación. Esto es lo que dije originalmente:

No creo que std :: unique_ptr sepa llamar a eliminar []. Efectivamente, tiene un int * como miembro: cuando elimina un int * va a eliminar todo el conjunto, por lo que en este caso está bien.

El único propósito de la eliminación [] en lugar de una eliminación normal es que llama a los destructores de cada elemento en la matriz. Para los tipos primitivos , no importa.

Lo dejo aquí porque aprendí algo, espero que los demás también lo hagan.

+1

Si usa 'new []' debe usar 'delete []' y 'std :: unique_ptr' es lo suficientemente inteligente como para manejar esto, así como muchas otras mejoras, razón por la cual reemplazará' std :: auto_ptr' pronto. – AJG85

+4

-1: 'delete' debe siempre y solo ser usado con' new'; del mismo modo, 'delete []' siempre debe usarse con 'new []'. Ver C++ 2003, sección 5.3.5 (expr.delete), para 2. –

+3

@Nathan: Sí importa. No es solo el destructor. Las rutinas de asignación de memoria dependen de que elimine la memoria con el método de asignación correspondiente. Por lo tanto, new/delete y new []/delete [] son ​​pares coincidentes. –

Cuestiones relacionadas