Errore di segmentazione utilizzando SDL con C ++, durante il tentativo di Blit delle immagini

StackOverflow https://stackoverflow.com/questions/341192

  •  19-08-2019
  •  | 
  •  

Domanda

OK - Ne ho uno interessante qui. Sto lavorando a un clone di tetris (sostanzialmente per "salire di livello" le mie abilità). Stavo cercando di riformattare il mio codice per renderlo astratto nel modo in cui lo desideravo. Mentre prima funzionava bene, ora ricevo un errore di segmentazione prima che qualsiasi immagine possa essere blittata. Ho provato a eseguire il debug senza risultati.

Ho pubblicato la mia copia di lavoro SVN del progetto qui .

È solo un piccolo progetto e qualcuno con più conoscenza di me e un buon debugger probabilmente lo capiranno in un attimo. L'unica dipendenza è SDL . Complimenti alla persona che può dirmi cosa sto facendo di sbagliato.

Modifica: per quanto posso dire, quello che ho ora e quello che avevo prima sono logicamente gli stessi, quindi non penso che ciò che ho ora provocherebbe un errore di segmentazione. Basta eseguire un ripristino svn sulla copia di lavoro, ricompilare e si può vedere che funzionava ...

È stato utile?

Soluzione

Guarda le righe da 15 a 18 di Surface.cpp:

    surface = SDL_DisplayFormatAlpha( tempSurface );
    surface = tempSurface;
}
SDL_FreeSurface( tempSurface );

Suppongo che segfaults perché quando usi questa superficie in seguito, stai effettivamente operando su tempSurface a causa di questa linea:

surface = tempSurface;

e non la superficie restituita da SDL_DisplayFormatAlpha (). Poiché liberate tempSurface, Surface punta ora a memoria non valida. Per risolvere, rimuovi semplicemente la seconda riga nel blocco else.

Altri suggerimenti

Non ho SDL installato sul mio computer, ma dopo aver controllato il codice.

L'ho notato nel file Output.cpp:

display = new Surface();

Non fai niente. Il costruttore per questo è vuoto. (la superficie non è inizializzata).

Quindi in Output :: initalize () lo fai:

display->surface = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF );

Sembra che il problema Surface :: surface non sia mai stato effettivamente inizializzato. Se non hai trovato la soluzione, quando torno a casa ci scriverò.

A quanto ho capito, si verifica un errore di segmentazione quando si tenta di mnaipulare un ponter che non è più disponibile o si tenta di modificare il valore di una costante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top