c++ - 使用成员函数作为自定义删除器与 std::shared_ptr 的问题

标签 c++ sdl shared-ptr

我正在尝试研究如何将 std::shared_ptr 与自定义删除器一起使用。具体来说,我将它与 SDL_Surface 一起使用:

std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);

编译和运行良好。但是,我想尝试自己的删除器,但不知道该怎么做。 SDL_FreeSurface 的文档可在此处找到:

http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface

我在其中发现 SDL_FreeSurface 声明为:

void SDL_FreeSurface(SDL_Surface* surface);

作为测试,根据该信息,我尝试了以下功能:

void DeleteSurface(SDL_Surface* surface)
{
    std::cout << "Deleting surface\n";
    SDL_FreeSurface(surface);
}

但是,使用 g++ 编译会出现以下错误:

error: no matching function for call to 'std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)'

我查看了 gcc std::shared_ptr 实现的 gnu 文档,但无法理解它。我做错了什么?

编辑:我已经缩小了问题的范围,但会留下上面的原始问题。我所拥有的是一个 Game 类,如果我将其分解为基本实现,则类似于:

class Game {
    public:
        /* various functions */
    private:
        void DeleteSurface(SDL_Surface* surface);
        bool CacheImages();
        std::vector<std::shared_ptr<SDL_Surface> > mCachedImages;

        /* various member variables and other functions */
}

DeleteSurface的实现如上,CacheImages()的实现如:

bool CacheImages()
{
    mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
    return true;
}

我上面列出的错误是哪个游戏我。但是,如果我将 DeleteSurface() 函数移到 Game 类之外而不进行其他更改,则代码会编译。在 Game 类中包含 DeleteSurface 函数会导致什么问题?

最佳答案

std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....), [=](SDL_Surface* surface)
{
    std::cout << "Deleting surface\n";
    SDL_FreeSurface(surface);
});

void DeleteSurface(SDL_Surface* surface)
{
    std::cout << "Deleting surface\n";
    SDL_FreeSurface(surface);
}

std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....), DeleteSurface);

编辑:

看到你更新的问题,DeleteSurface应该是非成员函数,否则需要使用std::bind或者std::mem_fn 或其他一些成员函数指针适配器。

关于c++ - 使用成员函数作为自定义删除器与 std::shared_ptr 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340810/

相关文章:

c# - 研究课题 list

c++ - while 循环不输出子字符串的下一个实例

haskell - 在 Windows 上为 Haskell 安装 SDL (GHC)

c++ - C++11 unique_ptr 和 shared_ptr 是否能够转换为彼此的类型?

c++ - C/C++ 中的指针编译但给出段错误

c++ - 如何在没有返回它的属性/函数的情况下获取派生接口(interface) (OLE/COM)

c++ - 如何在 cmake 中使用 SDL2 和 SDL_image

c - SDL 2.0 构建错误(重复)

c++ - 有没有办法通过将引用计数存储在受控对象中来 boost shared_ptr 的效率?

c++11 - 接口(interface)的shared_ptr的atomic_store