保证在集体处理时处理集体成员

时间:2012-11-08 09:02:28

标签: c++ destructor composition

我有以下情况:

我的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被销毁?

提前致谢

1 个答案:

答案 0 :(得分:2)

C ++遵循as-if行为,这意味着只要程序的行为不受影响,就可以在之前销毁理论 STRONG>。如果它没有受到影响,它何时被破坏并不重要。

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

保证:

12.4析构函数[class.dtor]

  

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

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