c++primer 3/13---析构函数

来源:互联网 发布:微博上的淘宝优惠券 编辑:程序博客网 时间:2024/05/02 08:47
// p points to default constructed object     Sales_item *p = new Sales_item;     {                               // new scope         Sales_item item(*p);  // copy constructor copies *p into item         delete p;             // destructor called on object pointed to by p     }                         // exit local scope; destructor called on item

变量(如 item)在超出作用域时应该自动撤销。因此,当遇到右花括号时,将运行 item 的析构函数。

动态分配的对象只有在指向该对象的指针被删除时才撤销。如果没有删除指向动态对象的指针,则不会运行该对象的析构函数,对象就一直存在,从而导致内存泄漏,而且,对象内部使用的任何资源也不会释放

当对象的引用或指针超出作用域时,不会运行析构函数。只有删除指向动态分配对象的指针或实际对象(而不是对象的引用)超出作用域时,才会运行析构函数。

与复制构造函数或赋值操作符不同,编译器总是会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非 static 成员,因此,它按成员在类中声明次序的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。

撤销内置类型成员或复合类型的成员没什么影响。尤其是,合成析构函数并不删除指针成员所指向的对象。

析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成析构函数仍然运行。例如,可以为 Sales_item: 类编写如下的空析构函数:

     class Sales_item {     public:        // empty; no work to do other than destroying the members,        // which happens automatically         ~Sales_item() { }        // other members as before     };

撤销 Sales_item 类型的对象时,将运行这个什么也不做的析构函数,它执行完毕后,将运行合成析构函数以撤销类的成员。合成析构函数调用string 析构函数来撤销 string 成员,string 析构函数释放了保存 isbn 的内存。units_soldrevenue 成员是内置类型,所以合成析构函数撤销它们不需要做什么。



原创粉丝点击