c++ - 如何检测传递给std::bind的实例已销毁

标签 c++ std-function

我有一个包含std::function列表的单例,并定期调用它。

class MySingleton
{
public:
    static MySingleton &instance()
    {
        static MySingleton inst;
        return inst;
    }

    void addFunc(const std::function<void(void)> &func)
    {
        m_list.push_back(func);
    }

protected:
    void periodicallyCalled()
    {
        for(auto f: m_list)
        {
            f();
        }
    }

private:
    std::vector<std::function<void(void)>> m_list;
}
用法:
class Test
{
public:
    void test()
    {
        somenum ++;
    }
protected:
    int somenum = 0;
}


Test *inst1 = new Test;
auto f1 = std::bind(&Test::test, inst1, std::placeholders::_1);
MySingleton::instance().addFunc(f1);

Test *inst2 = new Test;
auto f2 = std::bind(&Test::test, inst2, std::placeholders::_1);
MySingleton::instance().addFunc(f2);
一段时间后,我销毁了其中一个物体:
delete inst1;
periodicallyCalled()将崩溃,因为std::function上的实例之一不存在。
所以我的问题-有什么办法可以防止这种情况?如何检测该实例已被删除,并且可以安全地从列表中删除此类std::function

最佳答案

is there some way to prevent that?


在销毁该函数正在使用的对象之前,从列表中删除该函数。

How can I detect that instance was deleted and I can safety remove such std::function from the list?


你不能至少不是您编写代码的方式。因此,请先删除该功能。
如果您真的想检测对象是否还活着,请将对象包装在std::shared_ptr中,然后将std::weak_ptr与使用该对象的函数一起存储。然后,您可以在调用该函数之前查询std::weak_ptr。或者,改为存储std::shared_ptr,并在调用该函数之前查询其refcount> 1。

关于c++ - 如何检测传递给std::bind的实例已销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63825071/

相关文章:

c++ - 在被调用函数中更改函数指针(std::function)是否安全?

c++ - 为什么要为引用分配返回值?

c++ - 为什么我无法在CListBox 中获取选中的项目?多功能 Controller

c++ - 强制访问私有(private)成员

c++ - std::function 是否支持自定义分配器?

c++ - 使用成员函数创建 std::function 不编译

c++11 - std::function 是如何为 lambda 构造的

c++ - 如何从 Memory OutputStream 访问数据

c++ - QTableView - 样本

c++ - std::function<std::optional<T>()> 如何与返回 T 的 lambda 兼容?