简体   繁体   中英

Shared_ptr custom deleter

I need to do custom deleter for shared_ptr. I know that this can be done in a similar way:

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

But I would like to make them in the style of my custom deleter for 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>;

Is there any way to do this?

It seems that you're trying to define a type alias that means " std::shared_ptr with my deleter type". There's no such thing, because std::shared_ptr has a type-erased deleter (the deleter is not part of the type).

Instead, you could create a custom version of 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{});
}

Unlike a unique_ptr , the deleter for a shared_ptr is not part of the type. You must pass the deleter to the constructor of the shared_ptr .

You could wrap it in a function instead:

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

and then call make_shared_surface(Surf_return_f()) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM