我當前在將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)完成被實例化。
問題是:
- 爲什麼我不能要求SDL_Window默認的構造函數(或任何其他)?
爲什麼會出現的unique_ptr需要缺失者在這種情況下,而不是在這裏:
renderSystem_ = std::unique_ptr<Renderer::RenderSystem>(new Renderer::RenderSystem());
渲染系統是隻有一個默認的構造函數,析構函數的類。
是否因爲unique_ptr可以訪問析構函數,該析構函數充當刪除器並且不需要作爲模板參數來使用?
在此先感謝!
提供的功能有一個理由這個。當你創建一個指向SDL_Window的指針時,它應該是一個nullptr。爲什麼?因爲您很可能會調用爲您分配內存的SDL_CreateWindow。 – Poriferous 2015-04-03 01:16:46
所以基本上不允許自己分配內存,因爲SDL_CreateWindow知道得更好嗎?這究竟是如何實現的(在我自己的班級中)?我讀過關於刪除操作符,但我不認爲刪除默認構造函數會有多大意義 – EmeraldOverflow 2015-04-03 01:23:56
請記住,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