使用带std :: shared_ptr的自定义删除程序 [英] Using custom deleter with std::shared_ptr

查看:155
本文介绍了使用带std :: 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< 正在删除surface\\\
;
SDL_FreeSurface(surface);但是,使用g ++编译会给我以下错误:









b
$ b

 错误:无法调用'std :: shared_ptr< SDL_Surface> :: shared_ptr(SDL_Surface *,<未解析的重载函数类型>)的匹配函数'

我看过gnu文档中的gcc std :: shared_ptr实现,的。我做错了什么?



编辑:我已经缩小了问题,但会留下上面的原始问题。我有一个Game类,如果我把它剥离到一个基本的实现,是这样:

  class Game { 
public:
/ *各种函数* /
private:
void DeleteSurface(SDL_Surface * surface);
bool CacheImages();
std :: vector< std :: shared_ptr< SDL_Surface> >图片

/ *各种成员变量和其他函数* /
}

与执行 DeleteSurface 如上,并执行 CacheImages() as:

  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);
});

  DeleteSurface(SDL_Surface * surface)
{
std :: cout< 正在删除surface\\\
;
SDL_FreeSurface(surface);
}

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

编辑:



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


I'm trying to work out how to use std::shared_ptr with a custom deleter. Specifically, I'm using it with SDL_Surface as:

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

which compiles and runs fine. However, I would like to try out my own deleter and cannot work out how to do so. The documentation for SDL_FreeSurface is found here:

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

in which I find the SDL_FreeSurface is declared as:

void SDL_FreeSurface(SDL_Surface* surface);

As a test, and going by that information, I tried the following function:

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

However, compiling with g++ gives me the following error:

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

I have looked at the gnu documentation for the gcc std::shared_ptr implementation but cannot make much sense of it. What am I doing wrong?

EDIT: I've since narrowed down the problem, but will leave the original question above. What I had was a Game class which, if I strip it down to a basic implementation, was something like:

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 */
}

with the implementation of DeleteSurface as above, and the implementation of CacheImages() as:

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

which game me the error I listed above. However, if I move the DeleteSurface() function outside the Game class without otherwise altering it, the code compiles. What is it about including the DeleteSurface function in the Game class that is causing problems?

解决方案

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

or

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

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

EDIT:

Seeing your updated question, DeleteSurface should be a non-member function, otherwise you need to use std::bind or std::mem_fn or some other member function pointer adapter.

这篇关于使用带std :: shared_ptr的自定义删除程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆