成员函数什么时候超出范围?

时间:2017-10-18 08:17:38

标签: c++ thread-safety destructor raii

假设我有以下内容:

struct Foo
{
    Foo() : bar([&]{ doSomething();})
    std::function<void(void)> bar;
    void doSomething(){};
}

并且假设一个线程不断调用Foo实例的bar成员,而另一个线程则破坏Foo实例。因为首先调用Foo的析构函数,调用bar会导致函数调用无效吗?在解除分配之前,Foo的析构函数是否会使成员函数调用无效?

编辑: 对不起,我应该更具体一点,在调用bar的析构函数之前调用doSomething是否未定义?

2 个答案:

答案 0 :(得分:3)

  

由于首先调用Foo的析构函数,调用bar会导致函数调用无效吗?

是的,除非你确定没有发生。

  

在解除分配之前,Foo的析构函数是否会使成员函数调用无效?

是。一旦调用析构函数,对该对象及其子对象的所有引用都将失效。

请注意,成员函数与您拥有的不同。你所拥有的是一个成员对象的函数包装器。这种区别对答案没有任何影响。

答案 1 :(得分:0)

在对象有效之前,成员函数仍然有效。当对象被销毁时,成员函数也会被销毁,并且在调用析构函数时会破坏对象。因此析构函数中的调用使成员函数无效。如果在销毁对象后调用成员函数将导致未定义的行为。因此,您需要确保在对象被销毁后没有调用任何成员函数。