Shared_ptr 自定义删除器

Shared_ptr custom deleter

我需要为 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 不同,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()).

您似乎在尝试定义一个类型别名,意思是“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{});
}