2014-04-04 22 views
2

如果我有像我是否必须在析构函数中做任何事情来释放非指针成员变量?

class Foo { ... } 

class UsesFoo { 
private: 
    Foo foo; 
public: 
    UsesFoo() : foo(1, 2, 3) { } 
} 

然后按我的理解,当你建造一个UsesFoo(无论是UsesFoo *myMan = new UsesFoo();UsesFoo myMan;),它通过调用Foo(1, 2, 3)创建Foo对象仿佛。当UsesFoo遭到破坏(通过delete myMan;或超出范围),Foo里面也将被销毁。

如果我提供了下面的析构函数,Foo还会被破坏吗?

~UsesFoo() { } 

如果不是,那我该怎么做才能销毁Foo?换句话说,作为类实例的非指针成员变量是如何被破坏的语义是什么?

回答

5

如果我提供了下面的析构函数,Foo还会被破坏吗?

。答曰标准,

执行析构函数的主体和破坏人体内分配的任何自动对象之后,一个 析构X类要求X的直接非变异非静态数据成员的析构函数,如果X是最派生类(12.6.2)的类型,则其析构函数调用X的虚拟基类的 析构函数。

(C++ 11,§12.4/ 8)

+0

尼斯,从标准报价=)。这在C++ 11之前有多远? – Claudiu

+4

@Claudiu时间本身的开始。 – David

+0

@Claudiu,它在C++ 03中是§12.4/ 6。但我倾向于同意戴夫的评论。 – Brian

相关问题