我正在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.这个错误当然不只是我的电脑做了一些更奇怪的事情,我已经在多台电脑上运行相同的代码并得到了相同的结果。
好的,我不应该删除它。我不确定静态结构是什么,或者是一个malloc()的d指针,正如我所说我是C++的新手,但我会查找它。 – Aaron