2013-08-19 25 views
6

創建一個指向SDL_Window結構體的指針並將其分配給shared_ptr時,會出現上述錯誤。類的將'sizeof'應用於不完整類型'SDL_Window'

部分:

#include <SDL2/SDL.h> 

class Application { 
    static std::shared_ptr<SDL_Window> window; 
} 

定義:

#include "Application.h" 
std::shared_ptr<SDL_Window> Application::window{}; 

bool Application::init() { 
    SDL_Window *window_ = nullptr; 
    if((window_ = SDL_CreateWindow(title.c_str(), 
            SDL_WINDOWPOS_UNDEFINED, 
            SDL_WINDOWPOS_UNDEFINED, 
            window_width, 
            window_height, 
            NULL) 
     ) == nullptr) { 
     std::cerr << "creating window failed: " << SDL_GetError() << std::endl; 
    } 

    window.reset(window_); 
} 

出現在錯誤 'window.reset()'。什麼原因以及如何解決這種行爲?

+1

也許無關,但你不必須通過SDL_DestroyWindow,而不是刪除取消分配? – PlasmaHH

回答

8

默認情況下,shared_ptr將使用delete釋放受管資源。但是,如果您使用的是需要釋放的另一種方式的資源,你需要一個定製刪除:

window.reset(window_, SDL_DestroyWindow); 

注:我相當肯定,這將工作,但我沒有一個SDL做安裝來測試它。

+0

@vmrob:對不起,這是一個錯字,我的意思是函數'SDL_DestroyWindow'。函數指針應該是足夠的,而不必將其包裝在類中。 –

7

正如之前所說的Mike,您必須指定刪除者shared_ptr。但是,對於unique_ptr,您可能需要爲刪除器創建一個特殊類型,以便它可以乾淨地用作模板參數。我用這個結構:

struct SDLWindowDeleter { 
    inline void operator()(SDL_Window* window) { 
     SDL_DestroyWindow(window); 
    } 
}; 

然後包括通過模板參數缺失者:

std::unique_ptr<SDL_Window, SDLWindowDeleter> sdlWindowPtr = SDL_CreateWindow(...); 
+0

有沒有必要在這樣的類中包裝函數調用。刪除器可以是任何適當的可調用對象,包括指向「SDL_DestroyWindow」的指針。 –

+0

但是,如果將它與'std :: unique_ptr'一起使用,則需要一個類型而不是函數指針,對嗎? – vmrob

+2

對不起,我沒有注意到你已經開始討論'unique_ptr'。這也可以採取任何適當的可調用對象,包括函數指針。它會稍微混亂一點,因爲你需要在實例化模板時明確指定刪除類型(即'std :: unique_ptr '),所以自定義的類類型可能是整潔。 –