我正在尝试研究如何将std :: shared_ptr与自定义删除器一起使用.具体来说,我将它与SDL_Surface一起用作:
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);
Run Code Online (Sandbox Code Playgroud)
编译并运行良好.但是,我想尝试自己的删除器,但无法解决如何操作.SDL_FreeSurface的文档可在此处找到:
http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface
我在其中发现SDL_FreeSurface被声明为:
void SDL_FreeSurface(SDL_Surface* surface);
Run Code Online (Sandbox Code Playgroud)
作为测试,并通过该信息,我尝试了以下功能:
void DeleteSurface(SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
}
Run Code Online (Sandbox Code Playgroud)
但是,使用g ++编译会出现以下错误:
error: no matching function for call to 'std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)'
Run Code Online (Sandbox Code Playgroud)
我已经查看了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 */
}
Run Code Online (Sandbox Code Playgroud)
与上述执行DeleteSurface一样,执行CacheImages()如下:
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
Run Code Online (Sandbox Code Playgroud)
哪个游戏我上面列出的错误.但是,如果我将该DeleteSurface()函数移到Game类外部而不进行其他更改,则代码将进行编译.包含导致问题DeleteSurface的Game类中的函数是什么意思?
ron*_*nag 53
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....), [=](SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
});
Run Code Online (Sandbox Code Playgroud)
要么
void DeleteSurface(SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
}
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....), DeleteSurface);
Run Code Online (Sandbox Code Playgroud)
编辑:
看到你更新的问题,DeleteSurface应该是非成员函数,否则你需要使用std::bind或者std::mem_fn或者其他一些成员函数指针适配器.
chm*_*ike 10
此代码提供了一个以删除器作为对象方法的共享指针构造示例.它显示std::bind要使用的指令.
该示例是一个简单的对象回收器.当销毁对象的最后一个引用时,该对象将返回到回收器内的自由对象池.
通过向get()和add()方法添加一个键并将对象存储在一个中,可以很容易地将recyler更改为对象缓存std::map.
class ObjRecycler
{
private:
std::vector<Obj*> freeObjPool;
public:
~ObjRecycler()
{
for (auto o: freeObjPool)
delete o;
}
void add(Obj *o)
{
if (o)
freeObjPool.push_back(o);
}
std::shared_ptr<Obj> get()
{
Obj* o;
if (freeObjPool.empty())
o = new Obj();
else
{
o = freeObjPool.back();
freeObjPool.pop_back();
}
return std::shared_ptr<Obj>(o,
std::bind(&ObjRecycler::add, this, std::placeholders::_1));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50951 次 |
| 最近记录: |