我有以下情况:
我的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被销毁?
提前致谢
答案 0 :(得分:2)
C ++遵循as-if行为,这意味着只要程序的行为不受影响,就可以在之前销毁理论 STRONG>。如果它没有受到影响,它何时被破坏并不重要。
在实践中,b
将在其所有者b
实例的析构函数被销毁后立即销毁。
保证:
8)执行析构函数的主体并销毁任何内容 在body中分配的自动对象,类X的析构函数 为X的直接非变量非静态数据调用析构函数 成员,X直接基类的析构函数,如果X是 最派生类的类型(12.6.2),它的析构函数调用 X的虚拟基类的析构函数。 [...](强调我的)
请注意,如果发生这种情况,其可观察行为的实现仍然符合标准。在您的特定情况下,由于析构函数具有IO操作,因此可以保证实际发生此行为。