使用 C++/SDL2 加载图像 - "unhandled exception" , "access violation reading location"

Loading images with C++/SDL2 - "unhandled exception", "access violation reading location"

本文关键字:exception access violation location reading unhandled 使用 SDL2 加载 图像 C++      更新时间:2023-10-16

我正在为一个早期版本的SDL研究别人的Pong代码,我试图让它在SDL2上运行。下面是我的代码摘录,它只加载图像。当这段代码运行时,我得到一个弹出的窗口告诉我:在The Pong.exe中的0x00A065AD未处理异常:0xC0000005:访问违反读取位置0x00000004。在调试时,它也指向这一行:

optimizedImage = SDL_ConvertSurface(loadedImage, windowSurface->format, 0);

错误列表显示警告LNK4098: defaultlib 'msvcrt。Lib与其他Lib的使用冲突;使用/NODEFAULTLIB:库

我不知道该怎么理解这一切。最重要的是,SDL窗口显示,冻结,有时甚至在调试结束后也不会关闭。(当我尝试时,它告诉我有访问冲突)
#include <string>
#include <SDL.h>
const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT = 475;
const int SCREEN_BPP = 2;
SDL_Window *window = NULL;
SDL_Surface *windowSurface = NULL;
SDL_Surface *ball = NULL;
SDL_Surface *background = NULL;
SDL_Surface *paddleL = NULL;
SDL_Surface *paddleR = NULL;
SDL_Event event;
SDL_Surface *loadImage(std::string fileName)
{
    SDL_Surface *loadedImage = NULL;
    SDL_Surface *optimizedImage = NULL;
    loadedImage = SDL_LoadBMP(fileName.c_str());
    if (loadedImage != NULL)
    {
        optimizedImage = SDL_ConvertSurface(loadedImage, windowSurface->format, 0);
        SDL_FreeSurface(loadedImage);
        if (optimizedImage != NULL)
        {
            SDL_SetColorKey(optimizedImage, SDL_TRUE,
                            SDL_MapRGB(optimizedImage->format, 255, 255, 255));
        }
    }
    return optimizedImage;
}
bool init()
{
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
        return false;
    window = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED,
                            SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH,
                            WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
    if (window == NULL)
        return false;
    return true;
}
bool loadFiles()
{
    ball = loadImage("ball.bmp");
    background = loadImage("background.bmp");
    paddleL = loadImage("paddleRed.bmp");
    paddleR = loadImage("paddleBlue.bmp");
    if (ball == NULL)
        return false;
    if (background == NULL)
        return false;
    if (paddleL == NULL || paddleR == NULL)
        return false;
    return true;
}
int main(int argc, char* args[])
{
    windowSurface = SDL_GetWindowSurface(window);
    if (init() == false)
        return 1;
    if (loadFiles() == false)
        return 1;
    SDL_FreeSurface(windowSurface);
    SDL_FreeSurface(ball);
    SDL_FreeSurface(background);
    SDL_FreeSurface(paddleL);
    SDL_FreeSurface(paddleR);
    windowSurface = ball = background = paddleL = paddleR = nullptr;
    SDL_DestroyWindow(window);
    window = nullptr;
    SDL_Quit();
    return 0;
}

您正在呼叫

windowSurface = SDL_GetWindowSurface(window);

之前
window = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED,

所以窗口仍然是NULL,导致windowSurface为NULL,导致windowSurface->format导致崩溃