我想使用shared_ptr的删除器功能,但不想使用shared_ptr本身。也就是说,当shared_ptr超出作用域时,我想调用一个函数,并且删除器不需要传递任何指针。
我有以下代码,但感觉很简陋。
shared_ptr<int> x(new int, [&](int *me) { delete me; CloseResource(); });
有没有一种方法可以不将任何指针与shared_ptr关联起来?
更新:根据许多建议,使用unique_ptr的方式如下:
unique_ptr<int, std::function<void(int*)>> x(new int, [&](int *me) {delete me; CloseResource();});
实话说,它看起来比shared_ptr版本更糟糕,尽管它有多么“好”。
更新:对于那些喜欢使用我制作的这个简单的作用域关闭函数调用器的人,我让它变得更简单了,您甚至都不需要分配或释放对象:
shared_ptr<int> x(NULL, [&](int *) { CloseResource(); });
shared_ptr
的共享生命周期特性,使用unique_ptr
会更高效。其次,如果你可以使用Boost库,可以使用Boost.ScopeExit来实现这个功能。第三,如果你不能使用Boost,你可以很容易地自己编写一个类来实现这个功能,以避免使用unique_ptr
/shared_ptr
的笨拙方法。你可以参考这个链接:https://dev59.com/PnA65IYBdhLWcg3wuRF8。 - Cornstalks