智能指针和SDL技术

14

我应该使用原始指针来创建SDL_WindowSDL_RendererSDL_Texture等游戏内容吗?因为它们有特定的删除函数。

SDL_DestroyTexture(texture); 

我应该在创建unique_ptrshared_ptr时添加自定义删除器吗?如果是这样,那么对于SDL类型,我该如何操作?


1
最后一句话的意思是什么 - 我如何使用SDL变量来实现这个?你是在问如何创建一个unique_ptr,它会自动销毁某些SDL_*对象吗? - Praetorian
抱歉我的英文不好,我应该再读一遍。我的意思是如何创建一个unique_ptr来处理SDL_Window/Renderer/Texture等,因为它们都有不同的删除方式。或者我应该只使用原始指针,因为我知道它们应该在哪里被删除,这并没有太大区别。 - Dennis Harrop
1个回答

34

您可以创建一个函数对象,该对象具有多个重载的operator()实现,每个实现都调用相应参数类型的正确销毁函数。

struct sdl_deleter
{
  void operator()(SDL_Window *p) const { SDL_DestroyWindow(p); }
  void operator()(SDL_Renderer *p) const { SDL_DestroyRenderer(p); }
  void operator()(SDL_Texture *p) const { SDL_DestroyTexture(p); }
};

将其作为删除器传递给unique_ptr,如果您想要的话,可以编写包装函数来创建unique_ptrs

unique_ptr<SDL_Window, sdl_deleter>
create_window(char const *title, int x, int y, int w, int h, Uint32 flags)
{
    return unique_ptr<SDL_Window, sdl_deleter>(
             SDL_CreateWindow(title, x, y, w, h, flags), 
             sdl_deleter());
}

1
非常感谢 Praetorian,这正是我在寻找的 :) - Dennis Harrop
@Praetorian 在一个大型程序中应该把这个放在哪里? - karafar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接