2015-04-03 67 views
4

我當前在將SDL_Window指針存儲爲std :: unique_ptr時遇到了問題。
我想什麼:幾個有關SDL_Window和unique_ptr的問題

std::unique_ptr<SDL_Window> window_; 

解決辦法:

std::unique_ptr<SDL_Window, void(*)(SDL_Window*)> window_; 

第一次嘗試保存在內存頭引發錯誤,說SDL_Window是一個不完整的類型。嗯,我知道SDL_Window是一個結構,不能用

SDL_Window* window_ = new SDL_Window(); 

因此instanciation與SDL_CreateWindow(PARAMS)完成被實例化。

問題是

  1. 爲什麼我不能要求SDL_Window默認的構造函數(或任何其他)?
  2. 爲什麼會出現的unique_ptr需要缺失者在這種情況下,而不是在這裏:

    renderSystem_ = std::unique_ptr<Renderer::RenderSystem>(new Renderer::RenderSystem()); 
    

    渲染系統是隻有一個默認的構造函數,析構函數的類。
    是否因爲unique_ptr可以訪問析構函數,該析構函數充當刪除器並且不需要作爲模板參數來使用?

在此先感謝!

+1

提供的功能有一個理由這個。當你創建一個指向SDL_Window的指針時,它應該是一個nullptr。爲什麼?因爲您很可能會調用爲您分配內存的SDL_CreateWindow。 – Poriferous 2015-04-03 01:16:46

+0

所以基本上不允許自己分配內存,因爲SDL_CreateWindow知道得更好嗎?這究竟是如何實現的(在我自己的班級中)?我讀過關於刪除操作符,但我不認爲刪除默認構造函數會有多大意義 – EmeraldOverflow 2015-04-03 01:23:56

+3

請記住,SDL是用C編寫的,不幸的是,像我們這樣的C++用戶只需要適應SDL的操作。例如,您不會調用delete window_,而是調用SDL_DestroyWindow(window_)來釋放內存。任何非SDL都可以像正常情況一樣使用unique_ptrs和new和delete,但是因爲用C編寫的SDL沒有unique_ptr,也沒有new和delete,所以它不能識別您正在使用的語法。即使你能夠調用新的SDL_Window,它仍然沒有意義,因爲分配的內存將被SDL_CreateWIndow()返回的內容覆蓋。 – Poriferous 2015-04-03 01:31:17

回答

2

SDL_Window類型就像編譯器說的那樣不完整。

SDL庫在C語言中使用通用模式:指向不完整類型的指針。

在點創建獨特的指針,SDL_Window型看起來編譯器是這樣的:

struct SDL_Window; 

這是一種方式,你可以創建一個完全的類型。

除了SDL_Window是一個類型,編譯器不知道任何東西,而不是全局變量或函數。這也意味着它不能假設它有多大,它不能認爲它有任何構造函數或析構函數。

至於獨特的指針SDL_Window,另一種方法是使用這樣的:

struct SDLWindowDestroyer 
{ 
    void operator()(SDL_Window* w) const 
    { 
     SDL_DestroyWindow(w); 
    } 
}; 

std::unique_ptr<SDL_Window, SDLWindowDestroyer> window_; 

現在你不需要在構造函數中的window_