成员函数何时超出范围
When does a member function go out of scope?
假设我有以下内容:
struct Foo
{
Foo() : bar([&]{ doSomething();})
std::function<void(void)> bar;
void doSomething(){};
}
假设一个线程不断调用 Foo 实例的 bar 成员,而另一个线程破坏 Foo 实例。对 bar 的调用是否可能导致无效的函数调用,因为首先调用 Foo 的析构函数?Foo的析构函数在释放之前是否使成员函数调用无效?
编辑:抱歉,我应该更具体一点,在调用 bar 的析构函数之前,调用 doSomething 是否变得未定义?
对 bar 的调用是否可能导致无效的函数调用,因为首先调用 Foo 的析构函数?
是的,除非你确保这种情况不会发生。
Foo的析构函数在释放之前是否使成员函数调用无效?
是的。调用析构函数后,对该对象及其子对象的所有引用都将失效。
请注意,成员函数与您拥有的函数不同。您拥有的是一个作为成员对象的函数包装器。不过,这种区别对答案没有区别。
成员函数在对象有效之前一直有效。销毁对象时,成员函数也会销毁,调用析构函数时也会销毁对象。因此,析构函数中的调用会使成员函数失效。而如果在销毁对象后调用成员函数会导致未定义的行为。因此,您需要确保在销毁对象后没有调用任何成员函数。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 何时在引用或唯一指针上使用移动语义
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 何时提供默认参数作为模板参数
- 在基于范围的for循环中使用结构化绑定声明
- C++-明确何时以及如何调用析构函数
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 模板转换为超类
- 如果非动态变量被指针引用,何时超出范围?
- 在编译时何时计算范围::视图?
- 在命名成员函数重载解析期间,"this"何时不在范围内?
- thread.detach() 函数的左值何时会超出以下代码的范围
- 成员函数何时超出范围
- 临时参数值何时超出范围
- 何时分配块范围变量
- 何时在C++中使用"::"进行全局范围?