我正在用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。这个错误当然不仅仅是我的计算机做了一些奇怪的事情,我在多台计算机上运行相同的代码并得到了相同的结果。
答案 0 :(得分:2)
[
SDL_GetVideoInfo()
]将 只读指针 返回到包含当前视频硬件信息的结构。
SDL管理指向内存,所以不要尝试delete
它。很有可能它返回一个指向static
结构的指针。
虽然SDL(一个C库)不是管理内存并希望你清理它,但你应该永远不会在delete
上调用malloc()
{1}}'记忆。