3

我有以下情况:

我的 A 类包含 B 类的堆栈成员对象:

Class A{
    B b;
}

我正在使用 B 对象来重新定义 A 的初始化和销毁​​的行为。

Class B{
    B(){cout<<"taken care of some specific context initialization"<<endl;}
    ~B(){cout<<"cleaning the context initialization done before"<<endl;}
}

到目前为止,这是有效的,因为 ~B() 在 b 被销毁时被调用(我猜它是在 A 析构函数之后完成的)。

这是我正在寻找的行为,但我害怕编译器说:“嘿,你没有使用对象,我要回收之前的内存”的可能性。我想它应该发生,但是在任何编译器中都有可能吗?我的意思是,是否设定了您必须等待A被破坏的标准?

提前致谢

4

1 回答 1

2

C++ 遵循一种as-if 行为,这意味着只要程序的行为不受影响,理论上就有可能b被销毁。如果它没有受到影响,那么它何时被破坏并不重要。

但在实践中,b将在其所有者A实例的析构函数被销毁后立即被销毁。

它由以下方式保证:

12.4 析构函数 [class.dtor]

8)在执行析构函数的主体并销毁主体内分配的任何自动对象后,X 类的析构函数调用 X 的直接非变体非静态数据成员的析构函数,X 的直接基类的析构函数,如果 X是最派生类(12.6.2)的类型,它的析构函数调用 X 的虚拟基类的析构函数。[...](强调我的)

请注意,其可观察行为表现得好像正在发生这种情况的实现仍然符合标准。在您的特定情况下,由于析构函数具有 IO 操作,因此可以保证此行为实际发生。

于 2012-11-08T09:08:01.083 回答