una reservar memoria matriz matrices dinamicos dinamica crear bidimensionales arreglos c++ memory-management

reservar - matriz dinamica c++



GestiĆ³n de memoria en la asignaciĆ³n de matriz 2-D (2)

" ¿Cuál es la forma correcta de hacerlo? "

Usar contenedores estándar como, por ejemplo, std::vector<std::vector<int>> o std::array<std::array<int,N>,N> (se supone que N ya se conoce en tiempo de compilación) es la forma correcta .
No usa new() / new[] y delete / delete[] en el 1er lugar (además de los raros casos de uso válidos).

Si está seguro de que tiene dicho caso, elimínelo exactamente en el orden inverso al que estaba asignando usando new[] . delete [][]; no es una sintaxis válida, como el compilador ya te dijo.

He asignado una matriz bidimensional utilizando el siguiente código:

// Dynamic allocation int **matrix=new int*[n]; for(int i=0;i<n;i++) { matrix[i]=new int[n]; }

Esto funciona bien

  • En primer lugar, asignamos una matriz de punteros enteros.
  • A continuación, asignamos cada uno de los punteros anteriores para apuntar a una ubicación de memoria de n enteros. Esto crea nuestra matriz bidimensional.

Sé que un destructor para una matriz dinámicamente asignada debería verse así:

~SquareMatrix() { delete [] OneDarray; }

El énfasis está en [] porque si no está escrito, solo se eliminará el primer elemento de la matriz.

Por motivos similares, creo que necesito colocar el [] dos veces para eliminar todo el conjunto bidimensional, como

delete [] [] matrix;

Pero esto no funciona y da un error de tiempo de compilación.

¿Cuál es la forma correcta de hacerlo?


for(int i=0;i<n;i++) { delete [] matrix[i]; } delete [] matrix

Debe eliminar cada una de las matrices internas y luego eliminar la matriz.

Como se ha sugerido en un comentario. Una forma más segura de hacer esto sería usar contenedores estándar como std::vector . Podrías hacer algo como esto entonces:

std::vector<std::vector<int>> matrix;

Esto le daría una matriz bidimensional pero no tendría que manejar la limpieza.