我正在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