Anuncios Google

Hasta las... narices de la memoria dinámica

No entiendo porque cada dos por tres, el operador delete[] me falla así como los new...

 

Os explico, tengo un juego de la serpiente en que cargo los niveles en un array al principio del programa:

 

Nivel *Laberinto; // Puntero de estructura nivel, es un puntero global.
 
...
 
// Inicialización de niveles
 
Laberinto = new Nivel[NUMERO_DE_MAPAS]; /* Creamos tantas estructuras nivel como mapas haya*/
 
...
// Iniciamos cada nivel con sus parametros

 

Cargo los mapas y hasta ahí bien, el problema que mi juego tiene un editor de niveles. Luego el número de mapas puede variar en la ejecución, de modo que he colocado este código cuando se crea un nuevo mapa:

 

Nivel Buffer[NUMERO_DE_MAPAS+1];
 
for (int l = 0; l < NUMERO_DE_MAPAS;l++)
          Buffer[l] = Laberinto[l];
 
NUMERO_DE_MAPAS++;
 
delete[] Laberinto; // Borramos Laberinto y lo volvemos a crear                          
Laberinto = new Nivel[NUMERO_DE_MAPAS];
 
for (int l = 0; l < NUMERO_DE_MAPAS;l++)
          Laberinto[l] = Buffer[l];
 
Laberinto[NUMERO_DE_MAPAS-1].InicializarNivel(Fasess,1,0,0);

 

El código funciona, pero es muy "delicadito". He probado a crear varios niveles del tirón, cuando ya llevo 5-6 niveles creado el programa se queda pillado y sale el mensajito de windows de "Este programa no responde".

 

El numero de mapas no es lo suficientemente grande (21-25) como para agotar la memoria, y bueno la estructura nivel tampoco tiene demasiada carga:

struct Nivel
{
	Mapa Fase; // Esto es un matriz char de 80,60 aproximadamente
	int POSICIONINICIALX;
	int POSICIONINICIALY;
	int MOVIMIENTOX;
	int MOVIMIENTOY;
	int LONGITUDINICIAL;
	bool Piezas_Moviles;
	double Tiempo_Piezas_Moviles;
	int Piezas_Moviles_InicialX[100],Piezas_Moviles_InicialY[100],Pieza_Movil_MovimientoX[100],Pieza_Movil_MovimientoY[100], Piezas_Moviles_Contador;
 
 
... // Funciones
 
};

 

Puede ser fallo del SO? Corrupción de memoria? OverBuffer? (esto último no creo, porque si me funciona cuando creo 1-2 mapas...).

 

Os subo el código entero, aunque os advierto que es demásiado largo como para verlo entero:

https://dl.dropbox.com/u/69551225/Snake%20C%C3%B3digo.rar

 

 


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Andresmargar

Vectores

¿Y por qué no usas vectores? Por ejemplo:

// Define los niveles en un array dinámico
vector <Nivel> Laberinto;
 
Nivel tmp_laberinto; // Paso de datos al buffer
 
// Construimos el laberinto temporal
tmp_laberinto = Nivel();
 
// Creamos los niveles
for(short i=0;i<NUMERO_DE_MAPAS;i++){
 
   // Pasa el laberinto temporal al buffer
   Laberinto.push_back(tmp_laberinto);     
}
 
// Borrando laberintos
for(i=0;i<NUMERO_DE_MAPAS;i++){
    // Borra el mapa actual
    delete Laberinto[i];
}
 
//  Quita todos los mapas
Laberinto.clear();

A ver si te sirve, de todas formas es una alternativa, hay muchas más formas.


~Actualmente estudiando Ingeniería de las Tecnologías de la Telecomunicación en la Escuela de Ingenieros~

Al final ya lo solucione,

Al final ya lo solucione, pero gracias:

Nivel *Buffer = new Nivel[NUMERO_DE_MAPAS+1];
 
for (int l = 0; l < NUMERO_DE_MAPAS;l++)
             Buffer[l] = Laberinto[l];
 
NUMERO_DE_MAPAS++;
 
Buffer[NUMERO_DE_MAPAS-1].InicializarNivel(Fasess,1,0,0);
 
delete[] Laberinto;    
 
Laberinto = Buffer;

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.