函数中栈上定义的局部类,不会在函数外使用,有些是在块中定义的。每个类的析构顺序和定义顺序一定是正好相反吗?
1
newmlp 2023-06-29 11:31:34 +08:00
这是不是属于未定义行为,看编译器优化
|
2
tool2d 2023-06-29 11:38:54 +08:00
"具体来说,构造函数中成员初始化列表的顺序决定了成员对象的构造顺序,而析构函数的调用顺序与构造函数相反。"
网上查到的,理论上代码流程设计好,先析构后析构那个类,应该也没太大影响,不至于程序挂掉把。 |
3
exch4nge 2023-06-29 11:43:39 +08:00
语义上楼主说的对
|
4
elechi 2023-06-29 13:54:23 +08:00
是的
|
5
flyqie 2023-06-29 13:58:03 +08:00 via Android
|
6
xylophone21 2023-06-29 14:15:13 +08:00
https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals
这种问题来源比答案重要 What’s the order that local objects are destructed? In reverse order of construction: First constructed, last destructed. In the following example, b’s destructor will be executed first, then a’s destructor: void userCode() { Fred a; Fred b; // ... } |
7
Rooger 2023-06-29 14:26:29 +08:00
C++ 类析构是按先进后出的顺序吗?
函数中栈上定义的局部类,不会在函数外使用,有些是在块中定义的。每个类的析构顺序和定义顺序一定是正好相反吗? ChatGPT 是的,你是对的。在 C++中,局部对象的生命周期遵循先进后出( LIFO )的顺序,这被称为栈式生命周期或者作用域生命周期。 当一个局部对象在函数或者代码块中被创建时(例如通过声明或者初始化),它会在那个函数或者代码块的作用域内存在。当执行流程离开了那个作用域,局部对象就会被销毁。 对于类类型的对象,销毁过程就是调用析构函数。这意味着,最后一个被创建(也就是最先进入作用域)的对象会最先被销毁(也就是最先离开作用域)。这正好与创建对象的顺序相反。 例如: cpp Copy code { MyType a; { MyType b; } // b's destructor is called here } // a's destructor is called here 在这个例子中,a 首先被创建,然后 b 被创建。但是 b 的析构函数会首先被调用,然后才是 a 的析构函数。 |
8
justou 2023-06-29 14:27:26 +08:00
必须是那样, 利用 RAII 方式来保证一些动作得到执行
void func(){ auto socks_guard = wear_socks_guard(); // 构造时穿上袜子, 析构时脱掉袜子 auto shoes_guard = wear_shoes_guard(); // 构造时穿上鞋, 析构时脱掉鞋 // .... // 先脱鞋 // 再脱袜子 } |
9
leonshaw 2023-06-29 14:41:39 +08:00
类 -> 对象?
这不是 RAII 的基础么 |
10
name1991 2023-06-29 16:59:21 +08:00
ChatGPT 的答案能信吗?翻了下 c++ primer
ChatGPT 说得对!! |