c++ - 这个用于 SDL 类型的智能指针包装器安全吗?

标签 c++ c++11 sdl smart-pointers

我考虑过使用类似下面的东西,这样我就不必记得在方法末尾显式调用破坏函数:

#include <iostream>
#include <SDL2/SDL.h>
#include <memory>

int main()
{
    SDL_Init(SDL_INIT_VIDEO);

    std::unique_ptr<SDL_Window, decltype((SDL_DestroyWindow))>
        win { SDL_CreateWindow("asdf", 100, 100, 640, 480, SDL_WINDOW_SHOWN),
                  SDL_DestroyWindow };
    if (!win.get())
    {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_CreateWindow Error: %s",
                SDL_GetError());
        return 1;
    }

    SDL_Quit();
}

我不确定这是否是最佳方法。我担心这不会做我想要它做的事情,即使它看起来很简单。这种方法是否存在任何细微的错误?

最佳答案

引入一个新的范围,你应该没问题:

int main()
{
  SDL_Init(SDL_INIT_VIDEO);

  {
    std::unique_ptr<SDL_Window, decltype((SDL_DestroyWindow))>
      win { SDL_CreateWindow("asdf", 100, 100, 640, 480, SDL_WINDOW_SHOWN),
        SDL_DestroyWindow };
    if (!win.get())
    {
      SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_CreateWindow Error: %s",
          SDL_GetError());
      return 1;
    }
  } // win destroyed before SQL_Quit

  SDL_Quit();
}

关于c++ - 这个用于 SDL 类型的智能指针包装器安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37192436/

相关文章:

c++ - 如何在需要时将C++中的计算推迟?

c++ - 使用 QVector3D 在 OpenGL 中绘制点

c++ - Windows/C++ - 从 SDL_SetWindowIcon 的第三方 exe 加载图标 - 崩溃

c++ - SDL 中的每像素 2D 圆形碰撞检测

c++ - QGLWidget::renderText 边界框

C++ RNG (Mersenne Twister) 需要种子

c++ - 正则表达式在 g++ 4.9 下匹配但在 g++-5.3.1 下失败

c++ - 具有 std::string 属性的默认移动构造函数行为

c++ - #pragma 曾经是 C++11 标准的一部分吗?

c++ - 使用未声明的标识符 'glGenVertexArrays' 错误,即使在 OSX 10.8.5 中包含 OpenGL/gl3.h 之后