【发布时间】:2020-01-31 13:07:56
【问题描述】:
我目前正在编写一个代码,我需要在代码的多个部分之间静态共享一个对象的实例。所以基本上是一个单身人士。这个实例将被共享,直到没有人再使用它。此时我需要在删除实际实例之前执行一些清理操作。
如果有人在此之后请求共享实例,它将获得一个新创建的实例,依此类推。
所以我写了这样的东西:
template<typename F>
struct static_filter
{
template<typename ...Args>
static std::shared_ptr<F> get(Args... a)
{
return _inst = _inst ?: std::shared_ptr<F>(new F(a...));
}
static void cleanup()
{
// some cleanup operation over inst
_inst.reset();
}
private:
static std::shared_ptr<F> _inst;
};
template<typename F> std::shared_ptr<F> static_filter<F>::_inst{nullptr};
现在我正在寻找一种方法来自动检测何时没有人使用 _inst。 基本上,我希望每次 _inst 的 use_count() 降到 1 时都得到一个回调。此时我将能够清理和重置。
我想避免为此实现我自己的引用计数(应用程序到处都在使用 shared_ptr,更改为自定义类型会有点烦人)。
我尝试在我的实例上使用自定义删除器,类似于:
template<typename F>
struct static_filter
{
template<typename ...Args>
static std::shared_ptr<F> get(Args... a)
{
return _inst = _inst ?: std::shared_ptr<F>(new F(a..., **static_filter<F>::cleanup**));
}
static void cleanup()
{
// some cleanup operation over inst
_inst.reset();
}
private:
static std::shared_ptr<F> _inst;
};
template<typename F> std::shared_ptr<F> static_filter<F>::_inst{nullptr};
但显然这不起作用,因为我的 ref 计数器实际上从未达到 0。
有谁知道是否有办法使用 shared_ptr 实现这一点?
谢谢。
【问题讨论】:
-
我知道这一点,我正在寻找一种在实际值达到 1 时收到通知的方法。这里的目标是不必手动调用 cleanup() 而是将其触发为只要代码的其他部分没有引用 _inst。
-
使
_inst成为弱指针而不是共享指针。get()执行_inst.lock(),如果锁定失败,则创建一个新的。 F 的析构函数是你的cleanup。
标签: c++ shared-ptr