2012-11-20 49 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