在发布模式下运行时,我收到“访问冲突读取位置”错误 - C ++

时间:2017-08-11 02:36:42

标签: c++ sdl access-violation release-mode

我试着寻找答案,但无济于事。 在调试器模式下它工作正常,但当我把它放在发布模式时它给我这个

  

sdl project.exe中0x00DC1814处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

我的调试器和发布模式包括和库相同,甚至我的子系统是相同的。这是我的代码,我稍微缩短了一下

SDL_Surface *loadimage();

 struct picture
 {    
     int maxframe;
     SDL_Surface *surface = NULL;
     SDL_Rect rect;
     std::string filepath;
 };

SDL_Surface *background = NULL;
SDL_Surface *backbuffer = NULL;
SDL_Surface *holder = NULL;


std::vector<picture *> veck;

int main(int argc, char* argu[]){
    background = SDL_LoadBMP("pics/bac.bmp");

    if (background == NULL){
        return false;
    }

    int height = background->h;
    int width = background->w;

    init_testprogram();



    backbuffer = SDL_SetVideoMode(width, height, 32, SDL_SWSURFACE);
    SDL_WM_SetCaption("Yamada's first window", NULL);

    //this was here to test if i could format a surface more then once in 
    //the same format kept in just in case
    holder = SDL_DisplayFormat(background);
    background = SDL_DisplayFormat(holder);
    SDL_FreeSurface(holder);

        //this is where i get the error
veck[0]->surface = loadimage();
veck[0]->rect.w = veck[0]->surface->w;
veck[0]->rect.h = veck[0]->surface->h;

 //if commented out this is where i get my second error
veck.push_back(new picture);
veck[1]->rect.x = 39;
veck[1]->rect.y = 49;
veck[1]->surface = veck[0]->surface;
veck[1]->rect.w = veck[0]->surface->w;
veck[1]->rect.h = veck[0]->surface->h;
veck[0]->rect.x = 500;
veck[0]->rect.y = 200;

    //printing to screan 

TTF_Font *font = NULL;
Mix_Chunk *sound = NULL;

picture *picture1;    

 //if commented out again this is where i get my third error in sound
sound = Mix_LoadWAV("sound/walking in grass.wav");
font = TTF_OpenFont("fonts/CaviarDreams.ttf", 100);


    while (programisrunning()){

    //do SDL stuff herre

    }

    SDL_Delay(3000);
    SDL_Quit();
    TTF_Quit();
    Mix_CloseAudio();

    int t;
    std::cin >> t;
    return 0;
}

/////定义

SDL_Surface *loadimage(){
    veck.push_back(new picture);

    SDL_Surface* rawimage = NULL;
    SDL_Surface* processedimage = NULL;

    veck[0]->filepath = "pics/walk 3.png";
    rawimage = IMG_Load(veck[0]->filepath.c_str());

    if (rawimage == NULL){
        errorreport("image 'walk 3.png' failed to load\n");
        return false;
    }

    processedimage = SDL_DisplayFormat(rawimage);
    SDL_FreeSurface(rawimage);

    if (processedimage == NULL){
        errorreport("image 'walk 3.png' failed to process\n");
        return false;
    }

    Uint32 colorkey = SDL_MapRGB(processedimage->format, 255, 255, 255);
    SDL_SetColorKey(processedimage, SDL_SRCCOLORKEY, colorkey);

 // EDIt
        if (processedimage == NULL)
    errorreport("ERRRORORROROOR BUT WHY\n");



    return processedimage;
}

我知道它不是最好的做事方式,但这是我在sdl中做事的测试项目。如果我注释掉了孔洞[0]的事情,那么我得到了同样的错误,但是在veck.pushback()中进一步向下,如果我注释掉所有的vecks然后我得到声音的错误。我正在使用视觉工作室exress 2013,如果这有帮助的话。我不明白我做错了什么。

我确实删除了我认为无意义添加的内容

1 个答案:

答案 0 :(得分:2)

您在veck[0]->surface = loadimage();中有未定义的行为,因为veck[0]在执行loadimage()之前无法获取对象。

无法保证在评估loadimage()之前调用veck[0]