2010-03-21 30 views
24

he asignado y variedad de objetosdelete [] una matriz de objetos

Objects *array = new Objects[N]; 

Cómo debería eliminar esta matriz? Sólo

delete[] array; 

o con iterar sobre los elementos de la matriz?

for(int i=0;i<N;i++) 
    delete array[i]; 
delete[]; 

Gracias

UPDATE:

I cambiaron cuerpo del bucle como

delete &array[i]; 

para forzar el código para compilar.

+0

¿Estará una matriz de punteros o un puntero a la matriz? – osgx

+1

es un puntero a una matriz. – Naveen

+4

Haciendo esto: 'delete & array [i];' Es incorrecto. No usaste nuevo para asignar el conjunto de elementos [i], por lo que no debes eliminarlo. Eliminar toda la matriz. –

Respuesta

38

Cada uso de new se debe equilibrar con delete, y cada uso de new[] se debe equilibrar con delete[].

for(int i=0;i<N;i++) 
    delete array[i]; 
delete[] array; 

que serían apropiados sólo si ha inicializado la matriz como:

Objects **array = new Objects*[N]; 
for (int i = 0; i < N; i++) { 
    array[i] = new Object; 
} 

El hecho de que el código original que dio un error de compilación es un fuerte indicio de que estás haciendo algo mal .

BTW, obligatorio: evite la asignación de matrices con new[]; use std::vector en su lugar, y luego su destructor se encargará de la limpieza por usted. Además, será una excepción segura al no perder memoria si se lanzan excepciones.

+0

No puedo usar el vector. Es una tarea :) – osgx

+22

¡No! ¡No use std :: vector a ciegas como un sustituto de las matrices! Es como decir "Tengo una necesidad de transporte, así que usaré un automóvil". A veces es la respuesta correcta, pero a veces es necesario ir al lado y otras veces debes ir de Montreal a Moscú. En muchos casos, cuando una matriz está cerca de la respuesta correcta, pero desea una biblioteca estándar, std :: valarray es lo que desea. Y en muchos casos, una matriz es, de hecho, la respuesta correcta. –

+7

@Brooks. Puedo pensar en cualquier situación en la que una matriz dinámicamente asignada no pueda ser reemplazada eficientemente con std :: vector. Esto se debe a que std :: vector __IS__ una matriz (la única diferencia es que el vector maneja toda la administración de la memoria). Si se trata de una matriz ordenada estáticamente bien, puede obtener una pequeña mejora en el rendimiento con solo usar una matriz. –

6
delete [] array 

es suficiente.

11

Solo delete[] array es suficiente. Se garantiza que cada elemento de la matriz se elimine cuando elimine una matriz usando el operador delete[].

13

Como regla general debe delete/delete[] exactamente las cosas que asignó con new/new[]. En este caso, tiene una asignación con new[], por lo que debe usar una llamada a delete[] para liberar esa cosa asignada nuevamente.

El delete s en el for-loop no se compilará es también una buena indicación de que no son la forma correcta de hacerlo.

7

No sólo es

delete [] array; 

suficiente, pero si lo hace

for(int i=0;i<N;i++) 
    delete &array[i]; 
delete[] array; 

podrás causando un comportamiento indefinido, porque

delete &array[i]; 

se suprimiendo cosas que no eran' t devuelto por una operación new.

Sin mencionar que el siguiente delete[] array; llamará al destructor para todos los objetos que acaban de tener destructores llamados en el ciclo.

Así que no hagas eso.