[C++] Duda con new y delete[] o delete Tratando de hacer matriz dinamica

Iniciado por capsulasinformaticas, 21 Marzo 2013, 16:01 PM

0 Miembros y 1 Visitante están viendo este tema.

capsulasinformaticas

Estaba investigando como hacer matrices dinamicas y en una parte lei que podia hacerlo con new, entonces yo lo implemente de esta forma.

Código (cpp) [Seleccionar]
   void crearMatriz(int **m) {
           for (i=0; i<n; i++)
           m[i] = new int[n];
    }
   
   int main() {
       int **matriz1;
     
       matriz1 = new int *[n];
   
           crearMatriz(matriz1);


Lo que al parecer me funciona correctamente, el problema es que no se como hacer el delete correspondiente (lei que era una buena practica de programacion hacer el delete aunque la mayoria de los S.O. actuales liberan la memoria al cerrar el programa), ¿alguien me ayuda?.

amchacon

No solo es una buena práctica de programación, sino que debes hacerlo en programas más grandes cuando ya no necesites esa matriz (o malgastaras memoria).

Si para reservar la matriz tienes que hacer esto:

Código (cpp) [Seleccionar]
int** Matriz = new int*[n];

for (int i = 0; i < n;i++)
    Matriz[i] = new int[n];


Para borrarla tendrás que hacerlo al reves:

Código (cpp) [Seleccionar]
for (int i = 0; i < n;i++)
      delete[] Matriz[i];

delete[] Matriz;
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Puntoinfinito

Así es como se utiliza;

Código (cpp) [Seleccionar]
#include <iostream>     // std::cout

struct MyClass {
  MyClass() {std::cout <<"MyClass constructed\n";} //La utilizamos
  ~MyClass() {std::cout <<"MyClass destroyed\n";}
};

int main () {
  MyClass * pt;

  pt = new MyClass[3]; //Creamos variable dinámica
  delete[] pt; //Eliminamos

  return 0;
}


Saludos
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

amchacon

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Puntoinfinito

Es lo mismo... lo que busca es el funcionamiento de delete

Cita de: capsulasinformaticas en 21 Marzo 2013, 16:01 PM
Lo que al parecer me funciona correctamente, el problema es que no se como hacer el delete correspondiente (lei que era una buena practica de programacion hacer el delete aunque la mayoria de los S.O. actuales liberan la memoria al cerrar el programa), ¿alguien me ayuda?.

Mientras el ejemplo solucione su problema...
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

capsulasinformaticas

Cita de: amchacon en 21 Marzo 2013, 16:27 PM
No solo es una buena práctica de programación, sino que debes hacerlo en programas más grandes cuando ya no necesites esa matriz (o malgastaras memoria).

Si para reservar la matriz tienes que hacer esto:

Código (cpp) [Seleccionar]
int** Matriz = new int*[n];

for (int i = 0; i < n;i++)
    Matriz[i] = new int[n];


Para borrarla tendrás que hacerlo al reves:

Código (cpp) [Seleccionar]
for (int i = 0; i < n;i++)
      delete[] Matriz[i];

delete[] Matriz;


¿Y eso me sirve aun que haya hecho aparte de lo anterior, esto:

Código (cpp) [Seleccionar]
for (i=0; i<n; i++)
matriz1[i] = new int[n];


Que no solo seria un vector dinamico, si no que una matriz dinamica?.

amchacon

Claro, si te fijas es lo mismo que has hecho antes pero al reves (y en vez de new poniendo delete claro).

La mejor forma de confirmarlo es intentar acceder a la posición (0,0), si la aplicación se cierra inesperadamente = Has tocado memoria que no deberías tocar = No tienes memoria reservada.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

capsulasinformaticas

#7
Cita de: amchacon en 21 Marzo 2013, 17:56 PM
Claro, si te fijas es lo mismo que has hecho antes pero al reves (y en vez de new poniendo delete claro).

La mejor forma de confirmarlo es intentar acceder a la posición (0,0), si la aplicación se cierra inesperadamente = Has tocado memoria que no deberías tocar = No tienes memoria reservada.

Gracias compadre, despues de publicar el mensaje lei bien y me di cuenta de que si estaba bien pero ya me habias respondido, gracias.

EDIT: No se me cerro, pero me dio que despues de liberar la memoria la posicion 0.0 era igual a 0, despues la posicion 1.0 era como 39232131, supongo que esta bien...