14堆与拷贝构造函数

14堆与拷贝构造函数

ID:44351184

大小:350.76 KB

页数:30页

时间:2019-10-21

14堆与拷贝构造函数_第1页
14堆与拷贝构造函数_第2页
14堆与拷贝构造函数_第3页
14堆与拷贝构造函数_第4页
14堆与拷贝构造函数_第5页
资源描述:

《14堆与拷贝构造函数》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、一、关于堆二、需要new和delete的原因三、分配堆对象四、拷贝构造函数五、默认拷贝构造函数六、浅拷贝与深拷贝七、临时象八、无名对象九、构造函数用于类攪、关于堆全局变量、冃:卜态数据、常華存那全局数据区所有类成员函数和非成员函;汝代码存那代码区为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放栈区。余下的空间都被伽堆区(动态分配的内存)。二、需要new和delete的原因类对隼的建立在C++用new代替malloc()函数的一个原因是,在分配空间的候malloc()函数不能调用构造函数足分配空间、构造结构以及初始化的三位一体,他们统一由构造函数来成。voi

2、dfn()Tdate*pD;〃仅仅是个指针,没有趣掾pD=(Tdate*)malloc(sizeofTdate);〃并不调用构造函数//…free(pD);〃并不调用析构函数}此阳是一个含有类对象空间,对应的对象空间中的值不确定。为此,内存分配毘雍行初始化。例如,下面的代码描述用malloc()来进行对象的创建程voidfn(){Tdate*pD;pD=(Tdate*)malloc(sizeofTdate);pD->SetDate();〃设Sate值//…free(pD);}从根本上说,不是类对象的创建,因为它建梢造函数三、分配堆对嚎—看一下下面代码与前面的代码做一戟v

3、oidfn(){//分配堆空间并构造它〃先析构,然后将空间返堆Tdate*pS;pS二newTdate;//…deletepS;不必显式指出从new返回的指针类型,因为new必须知道对象的类型(他要藉此调用构造函数)如果分配局部对象:则在该局部对象退出作用域时(要么程序遇到函数结束标记要么遇到返回语句)自函数动调用。参考资料1:栈空间和堆空间一直都把堆栈放一起,所以很多人会误以为他们的组合是一个词语,就像一样简单,其实不然,今天在下就将最近学习总结的一些与大家分享。一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(sta&Tl:编译器自动分配释放,存放函数

4、的参数值,局部变量的值等,其操作方式类似于数据结构的栈。2、堆区(heaJT]一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。3、全局区(static)

5、:也叫静态数据内存空间,存储全局变量和静态变量,全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域,程序结束后由系统释放。一、由以上综述就可以得知,他们程序的内存分配方式不同。二、申请和响应不同:1>申请方式:栈区stack由系统自动分配,堆区heap需要程序员自己申请,C

6、中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。2、申请后系统的响应:栈:只要栈的剩余空间大于所申请的空间,体统将为程序提供内存,否则将报异常提示栈溢出。堆:首先应该知道操作系统有一个记录内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请的空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete或free语句就能够正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统

7、会将多余的那部分重新放入空闲链表中。三、申请的大小限制不同:栈:在windows下,修是向低地址扩展的数据结构是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。堆:陡是向高地址扩展的数据结构,雀不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。四、申请的效率不同:栈:栈由系统自动分配,速度快,但是程序员无法控制。堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方

8、便。五、堆和栈的存储内容不同:栈:血函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,第二个是函数的各个参数,在大多数I勺C编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最

9、开始存的地址,也就是主函数中的下一条指令。豹数调用的整个过程就是栈空间操作的过程1.建立被调函数的栈空间2・保护调用函数的运行状态和返回地址3?传递参数4.将控制转交被调函d)S048000堆:一般是在堆得头部用一个字节存放堆的大小,具体内容由程序员安排。参考资料2:关于对象的作用域与生存期需要明确一点

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。