关于SDL_Window和unique_ptr的几个问题

Eme*_*low 5 c++ sdl unique-ptr

我目前在将SDL_Window指针存储为std :: unique_ptr时遇到问题。
我试过的是:

std::unique_ptr<SDL_Window> window_;
Run Code Online (Sandbox Code Playgroud)

解决方案:

std::unique_ptr<SDL_Window, void(*)(SDL_Window*)> window_;
Run Code Online (Sandbox Code Playgroud)

第一次尝试一直在内存头中抛出错误,说SDL_Window是不完整的类型。好吧,我知道SDL_Window是一个结构,无法实例化

SDL_Window* window_ = new SDL_Window();
Run Code Online (Sandbox Code Playgroud)

因此,实例化是通过SDL_CreateWindow(params)完成的。

问题是

  1. 为什么不能为SDL_Window调用默认构造函数(或其他任何构造函数)?
  2. 在这种情况下,为什么unique_ptr需要删除器,但在这里不需要:

    renderSystem_ = std::unique_ptr<Renderer::RenderSystem>(new Renderer::RenderSystem());
    
    Run Code Online (Sandbox Code Playgroud)

    RenderSystem是一个只有默认构造函数,析构函数的类。
    是因为unique_ptr可以访问充当删除程序且不需要作为模板参数的析构函数吗?

提前致谢!

mil*_*bug 5

SDL_Window类型是,就像编译器说,不完整的。

SDL 库使用 C 语言中的一种常见模式:指向不完整类型的指针。

在创建唯一指针时,该SDL_Window类型在编译器中看起来像这样:

struct SDL_Window;
Run Code Online (Sandbox Code Playgroud)

这是创建不完整类型的一种方法。

编译器除了SDL_Window类型之外什么都不知道,而不是全局变量或函数。这也意味着它不能假设它有什么大小,它不能假设它有任何构造函数或析构函数。

至于指向 的唯一指针SDL_Window,另一种方法是使用这个:

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

std::unique_ptr<SDL_Window, SDLWindowDestroyer> window_;
Run Code Online (Sandbox Code Playgroud)

现在您不需要在构造函数中向 window_


Sia*_*ter 5

我发现这个更干净:

    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
    );
Run Code Online (Sandbox Code Playgroud)