成员函数何时超出范围

When does a member function go out of scope?

本文关键字:范围 何时超 函数 成员      更新时间:2023-10-16

假设我有以下内容:

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

假设一个线程不断调用 Foo 实例的 bar 成员,而另一个线程破坏 Foo 实例。对 bar 的调用是否可能导致无效的函数调用,因为首先调用 Foo 的析构函数?Foo的析构函数在释放之前是否使成员函数调用无效?

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

对 bar 的调用是否可能导致无效的函数调用,因为首先调用 Foo 的析构函数?

是的,除非你确保这种情况不会发生。

Foo的析构函数在释放之前是否使成员函数调用无效?

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

请注意,成员函数与您拥有的函数不同。您拥有的是一个作为成员对象的函数包装器。不过,这种区别对答案没有区别。

成员函数在对象有效之前一直有效。销毁对象时,成员函数也会销毁,调用析构函数时也会销毁对象。因此,析构函数中的调用会使成员函数失效。而如果在销毁对象后调用成员函数会导致未定义的行为。因此,您需要确保在销毁对象后没有调用任何成员函数。