2017-08-11 75 views
-3

我試圖找遍各地的答案,但無濟於事。 在調試模式下它工作得很好,但是當我把它在發行模式下,它給我的SDL project.exe在0x00DC1814這個我在發佈模式下運行時出現「訪問衝突讀取位置」錯誤 - C++

未處理的異常:0000005:訪問衝突讀取位置00000000。

我有我的調試器和發佈模式包括和庫相同,甚至我的子系統是相同的。這裏是我的代碼,我有一點縮短

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中做東西。如果我註釋洞veck [0]的東西,然後我得到相同的錯誤,但在veck.pushback()進一步下降,如果我註釋掉所有vecks然後我得到聲音的錯誤。如果有幫助的話,我正在使用visual studio 2013。我不明白我做錯了什麼。

我也切出的東西,我認爲是沒有意義在這裏

+0

你永遠不會驗證可以返回NULL指針的loadimage返回。 – dkackman

+0

爲什麼在'loadimage()'中使用'veck'?在我看來,你只需要一個字符串... – vu1p3n0x

+0

@dkackman如果我把「if(processedimage == NULL)」在loadimage()返回之前它是一樣的 –

回答

2

你有veck[0]->surface = loadimage();因爲veck[0]直到loadimage()已執行不會得到一個對象未​​定義的行爲增加。

無法保證loadimage()將在veck[0]被評估之前調用。

+0

以及如何從loadimage()然後獲得值。我從來沒有在調試器中遇到過這個問題,即使它返回了一個空值,它不應該導致錯誤檢查,爲什麼會導致一個問題,它是一個指針。 –

+0

@ Y.mada考慮在'loadimage()'中創建一個'picture',並將其返回而不是 – vu1p3n0x

+0

@ vu1p3n0x它的工作,非常感謝。不知道爲什麼我放棄投票壽 –