【问题标题】:Shared_ptr custom deleterShared_ptr 自定义删除器
【发布时间】:2020-06-19 10:37:39
【问题描述】:

我需要为 shared_ptr 做自定义删除器。我知道这可以通过类似的方式完成:

std::shared_ptr<SDL_Surface>(Surf_return_f(), MyDeleter);

但我想按照我的 unique_ptr 自定义删除器的样式制作它们:

struct SDL_Surface_Deleter {
    void operator()(SDL_Surface* surface) {
        SDL_FreeSurface(surface);
    }
};

using SDL_Surface_ptr = std::unique_ptr<SDL_Surface, SDL_Surface_Deleter>;

有什么办法吗?

【问题讨论】:

  • “以我的 unique_ptr 自定义删除器的风格”是什么意思?
  • 让它看起来像这样: using SDL_S_ptr = std::shared_ptr;我希望能够使用我的类型,而不必每次创建变量时都指定 MyDeleter。
  • shared_ptr 和 unique_ptr 的删除器不同。 unique_ptr 将删除器直接存储在指针中,因此不同的删除器具有不同的指针类型。通常这是一个问题,因为在同一个指针类型中不能有不同的删除器。 shared_ptr 将它存储在堆上,所以它没有这个问题。

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


【解决方案1】:

您似乎正在尝试定义一个类型别名,表示“std::shared_ptr 与我的删除器类型”。没有这样的东西,因为std::shared_ptr 有一个类型擦除的删除器(删除器不是类型的一部分)。

相反,您可以创建make_shared 的自定义版本:

template <class... Args>
std::shared_ptr<SDL_Surface> make_sdl_surface(Args&&... args) {
    return std::shared_ptr<SDL_Surface>(new SDL_Surface(std::forward<Args>(args)...),
                                        SDL_Surface_Deleter{});
}

【讨论】:

    【解决方案2】:

    unique_ptr 不同,shared_ptr 的删除器不是类型的一部分。您必须将删除器传递给shared_ptr 的构造函数。

    您可以将其包装在一个函数中:

    std::shared_ptr<SDL_Surface> make_shared_surface(SDL_Surface* surface)
    {
        return std::shared_ptr<SDL_Surface>(surface, MyDeleter);
    }
    

    然后拨打make_shared_surface(Surf_return_f())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多