1

我正在使用 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)。

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

4

1 回答 1

2

文档中

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

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

即使 SDL(一个 C 库)没有管理内存并希望您清理它,您也不应该调用' d内存。deletemalloc()

于 2012-11-20T17:38:57.303 回答