2012-11-20 78 views
1

我正在SDL中制作游戏,并使用SDL_VideoInfo获取显示器当前的分辨率。当我删除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;   
} 

我运行这个的前几次,它工作正常,然后我得到调试断言失败窗口弹出我。我不太确定它的含义,但我认为它与内存泄漏有关?我来自Java这里,所以内存泄漏和指针,这对我来说都是新的,所以我有点困惑。

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

所以,我认为,认为我固定它通过这样做,或者,至少当我做这个有没有调试断言失败的消息:(再次,从内存中这样做,我可能有一些拼写错误或者会导致错误的拼写错误,但你应该明白这一点)。

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.这个错误当然不只是我的电脑做了一些更奇怪的事情,我已经在多台电脑上运行相同的代码并得到了相同的结果。

回答

2

the documentation来自:

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

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

虽然即使SDL(C库)不是管理内存和预期你把它清理干净,你应该永远电话deletemalloc()倒是记忆。

+0

好的,我不应该删除它。我不确定静态结构是什么,或者是一个malloc()的d指针,正如我所说我是C++的新手,但我会查找它。 – Aaron