假设我有以下内容:
struct Foo
{
Foo() : bar([&]{ doSomething();})
std::function<void(void)> bar;
void doSomething(){};
}
并且假设一个线程不断调用Foo实例的bar成员,而另一个线程则破坏Foo实例。因为首先调用Foo的析构函数,调用bar会导致函数调用无效吗?在解除分配之前,Foo的析构函数是否会使成员函数调用无效?
编辑: 对不起,我应该更具体一点,在调用bar的析构函数之前调用doSomething是否未定义?
答案 0 :(得分:3)
由于首先调用Foo的析构函数,调用bar会导致函数调用无效吗?
是的,除非你确定没有发生。
在解除分配之前,Foo的析构函数是否会使成员函数调用无效?
是。一旦调用析构函数,对该对象及其子对象的所有引用都将失效。
请注意,成员函数与您拥有的不同。你所拥有的是一个成员对象的函数包装器。这种区别对答案没有任何影响。
答案 1 :(得分:0)
在对象有效之前,成员函数仍然有效。当对象被销毁时,成员函数也会被销毁,并且在调用析构函数时会破坏对象。因此析构函数中的调用使成员函数无效。如果在销毁对象后调用成员函数将导致未定义的行为。因此,您需要确保在对象被销毁后没有调用任何成员函数。