【发布时间】:2015-06-28 05:51:42
【问题描述】:
我目前正在尝试用 C++11 编写一个事件队列。我正在使用std::bind 获取std::function 对象,这些对象在某些事件发生时被调用。代码大致如下:
class A
{
public:
void handle();
};
class B { ... };
// Later on, somewhere else...
std::vector< std::function< void() > functions;
A a;
B b;
functions.push_back( std::bind( &A::handle, &a ) );
functions.push_back( std::bind( &B::handle, &b ) );
// Even later:
for( auto&& f : functions )
f(); // <--- How do I know whether f is still "valid"?
有什么方法可以保证函数对象的有效性,这样我就可以避免在这里遇到未定义的行为?
我已经在这里查看了这个问题,std::function to member function of object and lifetime of object,但它只讨论了删除指向绑定对象的指针是否会引发未定义的行为。我对如何处理此类对象的破坏更感兴趣。有什么方法可以检测到吗?
编辑:澄清一下,我知道我不能保证非静态、非全局对象的生命周期。通知它们的销毁就足够了,这样可以删除无效的函数对象。
【问题讨论】:
-
一个成员函数没有“生命周期”,你在绑定成员函数时使用的对象,另一方面,确实有生命周期,你要考虑的是对象的生命周期.不幸的是,没有办法保证非静态和非全局对象的生命周期。
-
是的,你是对的。是否可以通知非静态、非全局对象的销毁?或者我应该依靠各自的类实例来处理函数对象在删除时的删除?