1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 侯捷老师c++面向对象高级编程

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

时间:2021-11-15 15:37:49

相关推荐

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

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

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

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

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

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

错误如下:如果刚开始是进行自我赋值的话(即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后加[]编译器才会认识删除的是一个数组,下面有三个元素,才会调用三次析构函数,如果不加[],编译器不知道是数组,以为只有一个,只执行一次析构,造成内存泄漏。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。