tutorialspoint pointer multidimensional length array c++ arrays

pointer - Por qué el operador "delete[][]... multiDimensionalArray;" en C++ no existe



string array c++ (9)

Bueno, creo que es fácil de implementar, pero demasiado peligroso. Es fácil saber si un puntero se crea con un new[] , pero es difícil saber si hay un new[]...[] (si está permitido).

Siempre me he preguntado si hay un operador para eliminar matrices multidimensionales en el lenguaje C ++ estándar.

Si hemos creado un puntero a una única matriz dimensional

int *array = new int[size];

la eliminación se ve así:

delete [] array;

Eso es genial. Pero si tenemos una matriz de dos dimensiones, no podemos hacer

delete [][] twoDimenstionalArray;

En cambio, deberíamos repetir y eliminar los elementos, como en este ejemplo.

¿Alguien puede explicar por qué?


El motivo por el que se llama eliminar varias veces en ese ejemplo es porque también se llama nuevo varias veces. Se debe llamar a Delete para cada nuevo.

Por ejemplo, si asigné 1,000,000 de bytes de memoria, no puedo eliminar las entradas de 200,000 a 300,00, se asignó como un fragmento completo y debe liberarse como un fragmento completo.


La razón por la que debe buclear, como en el ejemplo que menciona, es que el compilador / asignador no conoce la cantidad de matrices que debe eliminar.

Cuando asignó su matriz bidimensional, realmente creó N matrices unidimensionales. Ahora cada uno de ellos tiene que ser eliminado, pero el sistema no sabe cuántos de ellos hay. El tamaño de la matriz de nivel superior, es decir, la matriz de punteros a las matrices de segundo nivel, es como cualquier otra matriz en C: el sistema no almacena su tamaño.

Por lo tanto, no hay forma de implementar delete [][] tal como lo describe (sin cambiar significativamente el idioma).


Porque no hay forma de llamar

int **array = new int[dim1][dim2];

Todas las noticias / eliminaciones deben estar equilibradas, por lo que no tiene sentido un operador de delete [][] .

new int[dim1][dim2] devuelve un puntero a una matriz de tamaño dim1 de tipo int[dim2] . Entonces dim2 debe ser una constante de tiempo de compilación. Esto es similar a la asignación de matrices multidimensionales en la pila.


Puedes usar una clase contenedora para hacer todo eso por ti. Trabajar con tipos de datos "primitivos" generalmente no es una buena solución (los arreglos deberían estar encapsulados en una clase). Por ejemplo std :: vector es un muy buen ejemplo que hace esto.

Se debe llamar a Delete exactamente cuántas veces se llama new. Como no puede llamar "a = new X [a] [b]", tampoco puede llamar a "delete [] [] a".

Técnicamente, es una buena decisión de diseño que evita la aparición de una inicialización extraña de una matriz n-dimensional completa.


Si bien todas estas respuestas son relevantes, intentaré explicar lo que llegó a ser una expectativa, que algo así como delete[][] array; puede funcionar en matrices asignadas dinámicamente y por qué no es posible:

La sintaxis int array[ROWS][COLS]; permitido en arreglos asignados estáticamente es solo una abstracción para los programadores, que en realidad crea una matriz unidimensional int array[ROWS*COLS]; . Pero durante el proceso de compilación (cuando los tamaños COLS y ROWS deben ser constantes por estándar), el compilador también recuerda el tamaño de esas dimensiones, que son necesarias para direccionar los elementos más tarde utilizando sintaxis, p. Ej. array[x][y] = 45 . El compilador, al ser conocido de este tamaño, reemplazará [x][y] con el índice correspondiente a una matriz unidimensional usando matemática simple: [COLS*x + y] .

Por otro lado, este no es el caso con las matrices asignadas dinámicamente , si desea la misma funcionalidad multidimensional (de hecho, notación). Como su tamaño puede determinarse durante el tiempo de ejecución, también tendrían que recordar el tamaño de cada dimensión adicional para su uso posterior, y recordar eso durante toda la vida de la matriz. Además, los cambios del sistema tendrían que implementarse aquí para trabajar con matrices en realidad como multidimensionales, dejando la forma de anotación de acceso [x][y] en el código, no reemplazándolo con una notación unidimensional durante la compilación, pero más tarde reemplazándolo en tiempo de ejecución.

Por lo tanto, la ausencia de array = new int[ROWS][COLS] no implica la necesidad de delete[][] array; . Y como ya se mencionó, no se puede utilizar en su ejemplo para eliminar su matriz "multidimensional", porque sus sub-arrays (dimensiones adicionales) se asignan por separado (utilizando una new llamada por separado), por lo que son independientes de la parte superior array ( array_2D ) que los contiene y no pueden eliminarse todos a la vez.


Técnicamente, no hay dos matrices dimensionales en C ++. Lo que está usando como una matriz bidimensional es una matriz unidimensional con cada elemento como una matriz unidimensional. Como técnicamente no existe, C ++ no puede eliminarlo.


delete [] se aplica a cualquier matriz no escalar.


no estoy seguro de la razón exacta desde el punto de vista del diseño del lenguaje, supongo que tiene algo que ver con el hecho de que al asignar memoria está creando un conjunto de matrices y cada una debe ser eliminada.

int ** mArr = new int*[10]; for(int i=0;i<10;i++) { mArr[i]=new int[10]; }

mi c ++ está oxidado, no estoy seguro de si eso es sintácticamente correcto, pero creo que está cerca.