2009-05-13 8 views
9

Cuando compilé un código usando el nombre de la matriz como un puntero, y eliminé el nombre de la matriz usando delete, recibí una advertencia acerca de eliminar una matriz sin usar el formulario de la matriz (no recuerdo la redacción exacta).¿Cuál es la forma de matriz de 'eliminar'?

El código básico era:

int data[5]; 
delete data; 

Así que, ¿cuál es la forma array de eliminar?

+3

Eso invoca un comportamiento indefinido porque la matriz no estaba asignada con new []. –

Respuesta

33

La forma array de eliminación es:

delete [] data; 

Editar: Pero, como otros han señalado, que no debería estar llamando delete de datos definidos así:

int data[5]; 

Usted solo debe llamarlo cuando asigna la memoria usando new de esta manera:

int *data = new int[5]; 
+2

Pero sus datos int [5] no fueron asignados por el operador new(), por lo que no hay una forma correcta de operador delete() que se pueda llamar. – RBerteig

+1

Interesante ... la respuesta es correcta, pero está muy equivocada. ¿Cómo obtuvo 17 votos? –

+2

Es tan fácil responder la pregunta realmente hecha, en lugar de la pregunta que debería haberse formulado. Especialmente cuando se repite tanto en el título como en la última oración. – RBerteig

0

Al igual que RichieHindle declaró anteriormente cuando desea liberar el espacio asignado dinámicamente para una matriz apuntada por data, debe poner dos corchetes [] entre la palabra reservada delete y el puntero al comienzo del espacio asignado. Dado que data puede apuntar a un solo int en memoria, así como al primer elemento de la matriz, esta es la única manera en que permite que el compilador sepa que desea eliminar todo el fragmento de memoria. Si no lo hace de la manera correcta, el comportamiento es "indeterminado" (Stroustrup, El lenguaje de programación C++).

2

El código como se muestra tiene la matriz en la pila, o en la parte inicializada del segmento de datos, es decir, no la desasigna (lo cual, como lo mencionaron otros, sería un "comportamiento indefinido"). en la "tienda gratuita", harías eso con delete [] data.

13

O lo quieren:

int *data = new int[5]; 
... // time passes, stuff happens to data[] 
delete[] data; 

o

int data[5]; 
... // time passes, stuff happens to data[] 
// note no delete of data 

La regla es géneros: delete sólo se aplican a la memoria que venía de new. Si se utilizó la matriz de new, entonces debe usar la matriz de delete para que coincida. Si se usó la ubicación new, nunca llama al delete, o usa una ubicación correspondiente delete.

Dado que la variable int data[5] es una matriz estáticamente asignada, no se puede pasar a ninguna forma del operador delete.

3

Como el otro han dicho, debe utilizar la forma vectorial de borrado:

void some_func(size_t n) 
{ 
    int* data = new int[n]; 

    . . . // do stuff with the array 

    delete [] data; // Explicitly free memory 
} 

ser muy cuidadosos de esto, debido a que algunos compiladores no advertirle.

Aún mejor, raramente hay necesidad de usar vector new/delete.Considere si su código puede ser alterado para hacer uso de std :: vector:

void some_func(size_t n) 
{ 
    std::vector<int> data(n); 

    . . . // do stuff with the array 

} // memory held by data will be freed here automatically 

Y si se trata de la memoria en un ámbito local, considere el STLSoft 's auto_buffer, que destinará a un buffer interno (que tuvo lugar en la pila, como parte de la instancia) si es posible, sólo va a la pila si no puede:

void some_func(size_t n) 
{ 
    stlsoft::auto_buffer<int, 10> data(n); // only allocates if n > 10 

    . . . // do stuff with the array 

} // memory held by data will be freed here automatically, if any was allocated 

Leer more about auto_buffer.

Cuestiones relacionadas