删除SDL_VideoInfo指针时,调试断言失败

时间:2012-11-20 16:32:55

标签: c++ sdl auto-ptr

我正在用SDL制作游戏,而我正在使用SDL_VideoInfo来获取显示器的当前分辨率。

示例代码:(对于函数/变量类型,这可能有一些拼写错误或错误的名称,我现在正在写我的内存。)

#include <SDL.h>
#include <iostream>
using namespace std;

int main()
{
    SDL_Init(SDL_INIT_EVERYTHING);
    const SDL_VideoInfo *vInfo = SDL_GetVideoInfo();
    cout << "Moniter Resolution:\n";
    cout << vInfo->current_w << endl << vInfo->current_h << endl;
    delete vInfo;
    return 0;        
}

前几次我运行它,它工作正常,然后我弹出Debug Assertion Failed窗口弹出我。我不太清楚这意味着什么,但我认为它与内存泄漏有关?我来自Java,所以内存泄漏和指针等对我来说都是新的,所以 我有点困惑。

无论如何,当我不删除vInfo时,代码工作正常,但在我看过的所有C ++书籍和视频之后,他们都发送了不删除指针的消息是编程亵渎。所以,(显然)删除vInfo是我唯一的选择。

所以,我认为,认为我通过这样做来修复它,或者,至少当我这样做时,没有Debug Assertion Failed消息:(再次,从内存中执行此操作,我可能有一些拼写错误或拼写错误会导致错误,但你应该明白这一点。

int main()
{
    SDL_Init(SDL_INIT_EVERYTHING);
    auto_ptr<const SDL_VideoInfo> vInfo(SDL_GetVideoInfo());
    cout << "Moniter Resolution:\n";
    cout << vInfo->current_w << endl << vInfo->current_h << endl;
    vInfo.release();
    return 0;        
}

把它扔进一个自动指针,一切都解决了。虽然我还不确定这是否解决了这个问题;仅仅因为我没有收到错误消息并不意味着没有发生坏事。

我的问题是,为什么我必须将vInfo放在auto_ptr中以避免此错误,有没有办法可以在不使用auto_ptr的情况下执行此操作,或者我是否还要担心删除vInfo?

有些人可能会说这个问题没用,因为我已经修复了问题,但我问的问题不是如何解决这个错误,这就是为什么我首先得到问题,如果我的解决方案可以以任何方式进行修改(不必使用auto_ptr,或者根本不必删除vInfo)。

P.S。这个错误当然不仅仅是我的计算机做了一些奇怪的事情,我在多台计算机上运行相同的代码并得到了相同的结果。

1 个答案:

答案 0 :(得分:2)

来自the documentation

  

[SDL_GetVideoInfo()]将 只读指针 返回到包含当前视频硬件信息的结构。

SDL管理指向内存,所以不要尝试delete它。很有可能它返回一个指向static结构的指针。

虽然SDL(一个C库)不是管理内存并希望你清理它,但你应该永远不会delete上调用malloc() {1}}'记忆。