Il problema è che è un programma un pò complesso, composto da diversi sorgenti.
Comunque posto un pò di codice, quello dove, presumibilmente si nasconde il problema.
Il problema accade quando deve essere distrutta la classe SchermataBattagliaR.
Se l'utente cliccando l'apposito pulsante arriva alla schermata definita dalla classe SchermataBattagliaR, nel main la variabile puntatore schermata di tipo Eventable si riferirà proprio all'oggetto di tipo SchermataBattagliaR.
Al termine del progrmma viene eseguito un delete oldschermata (per cancellare le schermate precedenti) e delete schermata.
Eventable è la classe astratta, che prevede il metodo per gestire gli eventi( void handleEvents(SDL_Event * event)) da cui le varie schermate ereditano.
Quando l'utente deve uscire dal programma, la variabile globale quitcode, importata con extern nei vari moduli, assumerà valore 1 per uscire dal programma.
All'uscita dal programma, se l'utente si trova sulla schermata di SchermataBattagliaR, si verifica il problema.
Spero di essere stato chiaro.
codice:
//main.cpp
#include "../include/SDLheaders.h"
#include "../include/SDLTools.h"
#include "../include/Directions.h"
#include "../include/Unit.h"
#include "../include/Eventable.h"
#include "../include/SchermataAvvio.h"
#include "../include/SchermataBattagliaR.h"
#include "../include/SimpleButton.h"
#include "../include/openURL.h"
#include <string>
#include <vector>
#include "../include/main.h"
using namespace std;
int quitcode=-1;
Eventable * schermata=NULL;
Eventable * vecchiaschermata=NULL;
SDL_Surface *screen = NULL;
int main( int argc, char* args[] )
{
//Inizializzo
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )return 1;
if(TTF_Init()==-1)return 1;
//Imposto lo schermo
screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
if( screen == NULL )return 1;
//Set the window caption
SDL_WM_SetCaption( "MascarfWar", NULL );
schermata=new SchermataAvvio(screen,vaiABattagliaRapida,vaiANuovaCampagna,vaiACaricaSalvataggio,vaiARiconoscimenti,vaiAIlSitoUfficiale,vaiAEsciDalGioco);
//gestiamo gli eventi:
events();
//usciamo dal programma
if (vecchiaschermata!=NULL)delete vecchiaschermata;
delete schermata;
TTF_Quit();
SDL_Quit();
return quitcode;
}
void events()
{
SDL_Event event;
while(quitcode<0)
{
SDL_WaitEvent(&event);
if (event.type== SDL_QUIT) quitcode=0;
else schermata->handleEvents(&event);
}
}
//SchermataBattagliaR.cpp
.......
SchermataBattagliaR::~SchermataBattagliaR()
{
if (this->msg!=NULL)delete this->msg;
deleteUnits();//Tutte gli oggetti della classe Unit vengono distrutti
Table::clear();
quit(&vbuttons,&vsurfaces,&vfonts); //tutti gli oggetti a cui si riferiscono i puntatori
//contenuti nei vector, il cui indirizzo viene passato
// per argomento alla funzione quit, vengono
//distrutti
}
.....
void SchermataBattagliaR::deleteUnits()
{
delete tcarroarmatomitr1; delete acarroarmatomitr1; delete tcarroarmatomitr2; delete acarroarmatomitr2;
delete tcarroarmatocannone1; delete acarroarmatocannone1; delete tcarroarmatocannone2;
delete acarroarmatocannone2;delete tfanteria1;delete afanteria1; delete tfanteria2; delete afanteria2;
delete tartanticarro1; delete aartanticarro1; delete tartanticarro2; delete aartanticarro2;
delete tcecchino1; delete acecchino1; delete tcecchino2; delete acecchino2; delete tsemicingolato1;
delete asemicingolato1; delete tsemicingolato2; delete asemicingolato2;delete tbombardiere;
delete abombardiere; delete tcaccia; delete acaccia; delete tartcontraerea; delete aartcontraerea;
}
................
//SDLTool.cpp
..................
void quit( vector<Eventable*> * veventables,vector<SDL_Surface*> * vsurfaces,vector<TTF_Font*> * vfonts)
{
if(veventables!=NULL)
{
for(int i=0;i<veventables->size();i++)delete veventables->at(i);
veventables->clear();
}
if(vsurfaces!=NULL)
{
for(int i=0;i<vsurfaces->size();i++)SDL_FreeSurface( vsurfaces->at(i) );
vsurfaces->clear();
}
if(vfonts!=NULL)
{
for(int i=0;i<vfonts->size();i++)TTF_CloseFont( vfonts->at(i) );
vfonts->clear();
}
}
.............................