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_sold 和revenue 成员是内置类型,所以合成析构函数撤销它们不需要做什么。
- c++primer 3/13---析构函数
- c++primer 之析构函数
- c++primer 3/1 ---函数
- c++primer 3/7---构造函数
- c++primer 3/12----复制构造函数
- C++Primer 函数
- C++primer函数进阶
- 【c++primer】函数探幽
- c++Primer,七,函数
- c++primer 要点-函数
- C++primer 函数
- C++primer函数汇总
- C++primer--拷贝控制__构造函数和析构函数的执行时期
- 重载函数 (C++Primer-9)
- 《C++Primer》读书笔记--函数模板
- c++primer之函数重载
- C Primer Plus(九) 函数
- C++Primer Plus 第十章-类的构造和析构函数
- Eclipse中Dorado进行CRUD操作
- fedora16安装qt
- Linux系统中/dev/mtd与/dev/mtdblock的区别(转载)
- 利用flex输出可直接运行的swf
- ExtractFileDrive、ExtractFilePath、ExtractFileDir、ExtractFileName、ExtractFileExt、ExtractRelativePath
- c++primer 3/13---析构函数
- union用法
- 推荐一本Android游戏开发方面的书
- DB2备份和复原数据库(复原失败找不到log文件的解决方案)
- 利用 spring+freemarker 发送邮件
- android分享功能的实现
- ACTIVE vs2010调用ACTIVE控件报错的处理方法
- 哲理故事与管理之道(16)-目标明确才有足够的信心
- 3_8_DOUBLEWEI Bootloader启动过程