память — C ++ SDL Необработанное исключение в 0x6C7DB2AA (SDL2.dll) в «Файл» .exe: 0xC0000005: Место чтения нарушения доступа 0x00000044

Приступая к SDL, я изложил следующие уроки «StaysCrisp» на DreamInCode. Проблема в том, что когда я пытаюсь использовать один из методов рисования. Я получаю ошибку:

Unhandled exception at 0x6C7DB2AA (SDL2.dll) in Tutorial.exe:
0xC0000005: Access violation reading location 0x00000044.

Проблема в методе рисования класса Sprite. Итак, вот код. Также на заметку, что я использую последнюю версию SDL (2.0.3), и я могу сказать из кода, что StaysCrisp нет.

#include "Sprite.h"
//constructor
Sprite::Sprite()
{

}

SDL_Surface*Sprite::Load(char*File)
{
SDL_Surface*temp = NULL;
SDL_Surface*optimized = NULL;

if ((temp = IMG_Load(File)) == NULL)
{
return NULL;
}

optimized = temp;
SDL_FreeSurface(temp);

return optimized;
}

bool Sprite::Draw(SDL_Surface*dest, SDL_Surface*src, int x, int y)
{
if (dest == NULL || src == NULL)
{
return false;
std::cout << "Could not draw the entire surface!\n ERROR: SPRITE.CCP";
}

SDL_Rect destR;

destR.x = x;
destR.y = y;

SDL_BlitSurface(src, NULL, dest, &destR); //Compiler says the problem is here

return true;

}

bool Sprite::Draw(SDL_Surface*dest, SDL_Surface*src, int x, int y,
int x2, int y2, int width, int height)
{
if (dest == NULL || src == NULL)
{
std::cout << "Could not draw sprite. SPRITE.CCP \n";
return false;
}

SDL_Rect destR;

destR.x = x;
destR.y = y;SDL_Rect srcR;

srcR.x = x2;
srcR.y = y2;
srcR.w = width;
srcR.h = height;

SDL_BlitSurface(src, &srcR, dest, &destR); //Compiler says the problem is here

return true;

}

0

Решение

Я смог воспроизвести ваш крах,

Избавьтесь от этой строки:

SDL_FreeSurface(temp);

temp и optimized указывают на один и тот же ресурс, поэтому освобождение одного означает, что они оба указывают на мусор.

В своем коде он вызвал функцию, которая явно выделяла некоторую копию этой памяти, в вашей вы просто назначаете указатель, который не будет работать.

optimized = SDL_DisplayFormatAlpha(temp); //this will create a copy
SDL_FreeSurface(temp);

Кроме того, я не уверен, что этот код даст что-то полезное, так как этот код выглядит так, как будто он был написан для SDL 1.2 (SDL1.2 и SDL2,0 — это достаточно разные звери, поэтому вы не сможете смешивать и сопоставлять код, если вы на самом деле не знаю, что ты делаешь).

Есть учебники для 2.0, я посмотрю, смогу ли я выкопать, где они для вас. ( http://lazyfoo.net/tutorials/SDL/index.php)

2

Другие решения


По вопросам рекламы [email protected]