una transpuesta matriz matrices llenar ingresar imprimir ejercicios datos como 3x3 2x3 c++ arrays memory-management

c++ - transpuesta - ¿Cuál es la forma de matriz de ''eliminar''?



matriz 3x3 en c++ (5)

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 sobre la eliminación de una matriz sin usar la forma de la matriz (no recuerdo la redacción exacta).

El código básico era:

int data[5]; delete data;

Entonces, ¿cuál es la forma de matriz de eliminar?


Al igual que RichieHindle dijo anteriormente cuando desea liberar el espacio asignado dinámicamente para una matriz señalada por data , debe colocar dos corchetes [] entre la delete palabra reservada y el puntero al principio del espacio asignado. Dado que los data pueden apuntar a un solo int en la memoria, así como al primer elemento de la matriz, esta es la única forma de que el compilador sepa que desea eliminar toda la parte de la memoria. Si no lo hace de la manera correcta, el comportamiento es "indeterminado" (Stroustrup, The C ++ Programming Language ).


Como ha dicho el otro, debe utilizar la forma vectorial de eliminar:

void some_func(size_t n) { int* data = new int[n]; . . . // do stuff with the array delete [] data; // Explicitly free memory }

Ten mucho cuidado con esto, porque algunos compiladores no te lo advertirán.

Aún mejor, rara vez es necesario utilizar vector new / delete. Considere si su código puede ser modificado 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 está manejando la memoria en un ámbito local, considere usar el STLSoft de auto_buffer , que asignará desde un búfer interno (que se mantiene en la pila, como parte de la instancia) si es posible, solo vaya al montón 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

Lea más sobre auto_buffer .


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


La forma de matriz de eliminar es:

delete [] data;

Edit: Pero como otros lo han señalado, no debería llamar a delete para datos definidos de esta manera:

int data[5];

Solo debe llamarlo cuando asigne la memoria utilizando una new como esta:

int *data = new int[5];


O bien quieres

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 de los géneros es: solo aplicar delete a la memoria que vino de new . Si se utilizó la forma de matriz new , entonces debe usar la forma de matriz de delete para que coincida. Si se usó la ubicación new , entonces nunca llamará delete , o usará una delete ubicación coincidente.

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