Falla de segmentación al usar SDL con C ++, tratando de generar imágenes Blit

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

  •  19-08-2019
  •  | 
  •  

Pregunta

OK, tengo una interesante aquí. Estoy trabajando en un clon de tetris (básicamente para 'subir de nivel' mis habilidades). Estaba tratando de refactorizar mi código para abstraerlo de la manera que lo quería. Si bien funcionaba bien antes, ahora tengo un error de segmentación antes de que cualquier imagen pueda borrarse. He intentado depurarlo en vano.

He publicado mi copia de trabajo SVN del proyecto aquí .

Es solo un proyecto pequeño y alguien con más conocimiento que yo y un buen depurador probablemente lo resolverá en un instante. La única dependencia es SDL . Felicitaciones a la persona que me puede decir lo que estoy haciendo mal.

Editar: Por lo que puedo decir, lo que tengo ahora y lo que tenía antes son lógicamente los mismos, por lo que no pensaría que lo que tengo ahora causaría un fallo de segmentación. Simplemente ejecute un svn revert en la copia de trabajo, vuelva a compilar y podrá ver que estaba funcionando ...

¿Fue útil?

Solución

Mire las líneas 15 a 18 de Surface.cpp:

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

Supongo que está predeterminado porque cuando usa esta superficie más tarde, en realidad está operando en tempSurface debido a esta línea:

surface = tempSurface;

y no la superficie devuelta por SDL_DisplayFormatAlpha (). Como libera tempSurface, la superficie ahora apunta a una memoria no válida. Para solucionarlo, simplemente elimine la segunda línea en el bloque else.

Otros consejos

No tengo SDL instalado en mi máquina, pero después de mirar el código.

Me di cuenta de esto en el archivo Output.cpp:

display = new Surface();

No haces nada. El constructor para esto está vacío. (la superficie no está inicializada).

Luego en Output :: initalize () haces:

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

Parece que el problema Surface :: surface nunca se inicializó realmente. Si no has encontrado la solución, cuando llegue a casa, buscaré en ella.

Según tengo entendido, se produce un error de segmentación cuando intentas mnaipular un ponter que ya no está disponible o cuando intentas cambiar el valor de una constante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top