Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    95

    [c++] Windows has triggered a breakpoint

    Sto realizzando un gioco in c++, usando la libreria SDL.
    Sto usando visual c++ express 2010.
    Quando tento di chiudere il programma ho il seguente messaggio:

    "Windows has triggered a breakpoint in nomeprogramma.exe.

    This may be due to a corruption of the heap, which indicates a bug in nomeprogramma.exe or any of the DLLs it has loaded.

    This may also be due to the user pressing F12 while nomeprogramma.exe has focus.

    The output window may have more diagnostic information."

    E nella finestra che riporta il messaggio su citato, ho 2 pulsanti: "break" e "continue".
    Insomma per terminare il programma devo per forza andare su Debug->Stop debugging, altrimenti non termina.

    Ho notato che l'errore si verifica appunto quando viene chiamato il distruttore di un oggetto, che alla fine deve essere appunto, eliminato.
    Come faccio a risolvere il problema? Sto impazzendo...

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E' un problema di codice (allocazione di memoria/oggetti ...). Come si fa senza poterlo controllare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    95
    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();
    	}
    }
    .............................
    Immagini allegate Immagini allegate
    • Tipo di file: jpg p.jpg‎ (736 Bytes, 5 visualizzazioni)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.