I currently had a problem with storing a SDL_Window pointer as a std::unique_ptr.
What I tried was:
std::unique_ptr<SDL_Window> window_;
The solution:
std::unique_ptr<SDL_Window, void(*)(SDL_Window*)> window_;
The first attempt kept throwing errors in the memory header, saying SDL_Window is an incomplete type. Well I know that SDL_Window is a struct and can't be instanciated with
SDL_Window* window_ = new SDL_Window();
therefore the instanciation is done with SDL_CreateWindow(params).
Questions are:
Why does the unique_ptr needs a deleter in this case, but not here:
renderSystem_ = std::unique_ptr<Renderer::RenderSystem>(new Renderer::RenderSystem());
RenderSystem being a class with just a default constructor, destructor.
Is it because the unique_ptr can access the destructor, which acts as the deleter and doesn't need to come as a template argument?
Thanks in advance!
The SDL_Window
type is, just like the compiler says, incomplete.
The SDL library is using a common pattern in C language: pointers to incomplete type.
At the point you create the unique pointer, the SDL_Window
type looks to the compiler like this:
struct SDL_Window;
That's one way you can create an incomplete type.
The compiler doesn't know anything except that SDL_Window
is a type, and not a global variable or a function. This also means it cannot assume what size it has, it cannot assume that it has any constructors or a destructor.
As for the unique pointer to the SDL_Window
, another way is to use this:
struct SDLWindowDestroyer
{
void operator()(SDL_Window* w) const
{
SDL_DestroyWindow(w);
}
};
std::unique_ptr<SDL_Window, SDLWindowDestroyer> window_;
Now you don't need to provide a function in a constructor to the window_
I find this cleaner:
auto window = std::unique_ptr<SDL_Window, std::function<void(SDL_Window *)>>(
SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, kWindowWidth, kWindowHeight, 0),
SDL_DestroyWindow
);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With