文档介绍:《C++面向对象程序设计》教学内容
第1章 C++概述
第2章类和对象
第3章面向对象程序设计概述
第4章进一步学习类和对象
第5章堆与复制构造函数
第6章继承性:派生类
第7章运算符重载
第8章虚函数和多态性
第9章模板
第10章类库和C++的标准模板库STL
第11章输入输出流
第12章异常处理
第5章堆与复制构造函数
堆
需要new和delete的原因
默认的复制构造函数
自定义复制构造函数
堆 Heap
堆是按动态方式分配的内存区域。
在程序中需要空间存放数据时,就申请动态内存单元,使用完毕后释放动态内存单元。
这种动态内存分配方式能够显著地提高内存的利用率。
C++程序的内存布局
Stack 栈
Heap 堆
Global data 全局数据区
程序代码区program code
代码区存放程序的代码(可执行指令);
全局数据区存放全局变量、静态变量、常量。
固定存储区域
栈是存放程序中的所有动态局部变量、函数参数、函数返回值等信息的一块内存区域。
在固定存储区域与堆栈之间的自由区域称为堆
栈 Stack
栈的内存管理严格遵循后进先出(LIFO: Last in, First Out)的顺序,
即释放栈中对象所占内存时的顺序刚好与给这些对象分配栈中内存时的顺序相反,这一点正是实现函数调用所需要的。
从栈中分配内存效率特别高,对栈的充分利用是C/C++编译程序能产生优质高效代码的原因之一。
动态内存分配
堆的内存是以动态分配方式管理的。
所谓动态分配的内存是在程序运行期间获得的。
动态存储分配方式允许我们的程序可以在执行期间根据实际的需要存放的数据量来申请合适数量的内存单元。
这种动态分配方式不但能够提高内存的利用率,而且对于链表和二叉树等动态数据结构特别有用。
动态内存申请和释放
用函数malloc( ) 分配的动态内存必须用函数free( )释放;
用new申请的动态内存必须用delete 释放。
因为在C++程序中,从堆中获取的内存单元不会被自动释放,因此必须使用函数free( )或者用delete释放这种内存。
如果从堆中获取的内存在使用完后没有被释放,这部分内存在程序结束之前会一直被占用,这种情况被称为“内存泄漏”。
需要new和delete的原因
需要new和delete的原因
在堆上创建对象
需要new和delete的原因
对自定义的类类型,使用函数malloc( )给对象分配动态空间时不能自动调用构造函数;
使用函数free( )释放对象所占用的动态空间时也不能调用析构函数。
C++语言创建了new和delete两个运算符来满足面向对象的新特性,
在C++语言程序中,我们应该使用new和delete来创建和销毁类的对象。
在堆上创建对象
使用new运算符在堆上创建对象时能够自动调用构造函数进行初始化;
使用 delete运算符释放对象占用的动态内存时能够自动调用该对象的析构函数进行善后处理。