FILE *访问冲突

时间:2013-05-02 16:47:21

标签: c++

我对Visual Studio 2012有一个恼人的访问冲突问题。我在Visual Studio 2010中遇到了同样的问题,我认为它可能是一个编译器问题,但事实证明它不是。

以下是为我提供访问冲突的代码的一部分:

SDL_Surface *cGraphicsManager::LoadImageFromPak(char *filename, char *img_type)
{
    // Load the 'file' to SDL_Surface

    SDL_Surface *img = NULL;    
    char errorname[50];
    sprintf(errorname, "Unable to load image %s from pakfile", filename);

    FILE *fin = pakfile.open_file(filename);
    if(!fin)
    {
        ErrorLog(errorname);
        return NULL;
    }

    SDL_RWops *rw;
    rw = SDL_RWFromFP(fin, 1);
    if (!rw)
    {
        ErrorLog("Erro na linha 213");
        return NULL;
    }

    img = IMG_LoadTyped_RW(rw,0, img_type);  // it crashes on this line
    if(img == NULL)
        ErrorLog("Unable to load image from pakfile.");
    SDL_FreeRW(rw);
    //pakfile.close_mpk();
    //if (img_type == "PNG")
    img = add_transparency(img);
    return img;
}

它让我在位置0x00000014处写入访问冲突。 奇怪的是它在MingW编译器上编译并运行良好,这让我觉得它不是错误的代码。 我读了一些关于File *和Dll调用的问题,但我没有找到解决方法。 我没有链接警告,我已经链接了所有必要的库。我也在调试模式下运行它并在多线程调试dll(MDd)中编译。 与MingW相比,Visual Studio编写代码更快,调试更容易,我很感激任何回复。 非常感谢你。

1 个答案:

答案 0 :(得分:2)

地址正在告诉 - 代码正在解除引用空指针以访问来自对象地址的0x14 (20)字节的成员。我会嗅探rw参数的内容。它可能不是null,但可能包含一个成员。我还认真地建议使用一个调试器来停止崩溃,这样你就可以检查调用堆栈了。最后一个建议 - 如果您使用的是第三方库,可能需要某种初始化调用来设置全局状态。如果不这样做可能会导致崩溃(个人经历)。