C++中的析构函数允许做什么
What is allowed to do in destructors in C++?
我正在努力理解析构函数中允许做什么。
标准规定:;对于具有非平凡析构函数的对象,在析构函数完成执行后引用对象的任何非静态成员或基类会导致未定义的行为">
cppreference是这样描述销毁序列的:"对于用户定义的或隐式定义的析构函数,在执行析构函数体之后,编译器为类"的所有非静态非变体成员调用析构函数;。
这是否意味着,在下面的代码中,从其成员的析构函数调用方法是UB?或者通过";参考";标准意味着什么特别的东西?
struct Foo {
Foo(Callback cb) : cb_(cb) {}
~Foo() {
// body of Bar destructor finished at this moment;
// cb_() calls Bar::call_me()
cb_();
}
Callback cb_;
};
struct Bar {
// pass callback with captured this
Bar() : foo_([this]() { call_me(); }) {
}
void call_me() {
}
// foo is a member, its destructor will be called after Bar destructor
Foo foo_;
};
此外,短语";在析构函数结束之后;确切地说是标准均值?销毁器的主体完成后?还是在所有成员和基类都被销毁之后
我认为最后一个问题的答案是理解什么是允许的,什么是不允许的关键。
Bar
的析构函数尚未完成,因此引用Bar
的一个成员,并在其析构函数中调用Bar
的一个会员函数是可以的。
调用超级对象的成员函数可能有点不稳定,因为成员函数可能会访问子对象,并且在调用成员函数时,一些子对象可能已经被破坏,在这种情况下,访问被破坏的对象将导致未定义的行为。你的例子并非如此。
或者通过";参考";标准意味着什么特别的东西?
我认为这意味着形成一个子对象的指针或引用。正如下面的例子中所做的那样。
此外,短语";在析构函数结束之后;确切地说是标准均值?销毁器的主体完成后?还是在所有成员和基类都被销毁之后?
后者。
首先执行主体,然后析构函数调用子对象析构函数,然后析构函数完成。
相关文章:
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 我不知道这条线是做什么的
- 这个模板在做什么?
- ID3D11Device::CreateBuffer在引擎盖下做什么?
- 这段代码的最后一行在做什么?
- 标志 |= f == s[i],这个语句会做什么?
- unique_ptr < 0 或小于运算符做什么?
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 当一行中只有一个"#"而没有其他内容时,C++预处理器会做什么?
- 没有大小参数的CString::GetBuffer()做什么
- std::stringstream::flush() 应该做什么吗?
- 为了从自定义目录使用 CMake,我需要做什么?
- C++在变量的内存地址上做什么来"deallocate"它?
- if(i | j) 和 if (i & j) 在C++中做什么
- 函数 f 在做什么?
- 第二个常量在运算符函数中做什么?
- 这个构造函数是做什么的
- "new int * **[10]"做什么?
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢