栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

侯捷老师c++面向对象高级编程

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

侯捷老师c++面向对象高级编程

class string中用的char* 指针指向一块字符串空间,等到用的时候再用new开辟空间,这样的话是动态分配的设计,如果放的是数组,则无法设定大小。

 

如下图:string类里如果默认赋值(即传入指针指向空),会分配一个结束字符''。c/c++的字符串末尾都是用结束符结束。class里用了动态分配指针,就要在析构函数里delete释放空间

 

如下图:如果类内有指针成员,就必须要用拷贝构造和操作符重载。如果用默认拷贝构造函数的话a,b指向同一块区域,此时world造成内存泄漏。

 

下图中进行=重载时用了检测自我赋值,即当要拷贝的对象和本身相同就直接返回本身即可。代码

效率更高,且避免了错误。

  

错误如下:如果刚开始是进行自我赋值的话(即a=a;事实上两边是同一个指针,下图侯老师为了好理解把它画成左边和右边),如果不加检测自我赋值,就会发送错误。

如下图,str调用get_c_str()函数得到指向字符串的char*类型指针,通过<<直接给cout,cout能直接输出字符串,这里和c语言不太一样,c语言printf只有指定%s,char*类型指针才会输出字符串,%p则是输出指针(也就是字符串首地址)

  堆,栈与内存管理

 

 在全局函数中,创建的对象一但离开作用域就析构函数就被自动 调用

 new的实质:(如下图)

 delete的实质:(第一步的调用析构函数只是把字符串动态分配的内容给沙雕,也就是hello删掉,但string本身是一个指针m_data,第二步才把指针free掉)

 在vc里分配的内存块:如下图,左一列是在调试模式下,complex只占实数(4bit)+虚数(4bit)也就是8个bit,灰色的是调试模式下才有的,每块4个bit,一共占36个bit,上下的cookie是系统回收内存时,malloc和free约定的记录占用内存的长度的内存(这里左一列应该是40(16进制的64),但因为要借用最后一个bit的0或1来表示这块内存是给出去还是收回来),每块占用4个bit,因为vc储存必须是16的倍数,这里一共只有52位,所以补充3块4字节长度的pad。

左三列的字符串(本质是指针所以占4个字节)内存块和左一一样,只不过正好是16的倍数,不用pad填充。

左二和左四是不在调试模式下的内存占用情况,没有灰格子。

   

下图是array[]动态分配,道理和上面的分配一样,只是多了一个记录数组元素个数的4bit的内存(vc是这样,其他的侯老师也不敢保证),就是下图中的3的那块内存。

 

 当new一个数组时,delete后也要加[],不然会造成内存泄漏:这里内存泄漏的原因不是delete的第二个步骤(即删除如下指针所指向的内存块),因为删除是看free和malloc约定的cookie,这里的cookie没问题,所以问题出在了第一步,delete后加[]编译器才会认识删除的是一个数组,下面有三个元素,才会调用三次析构函数,如果不加[],编译器不知道是数组,以为只有一个,只执行一次析构,造成内存泄漏。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604557.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号