侯捷老师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后加[]编译器才会认识删除的是一个数组,下面有三个元素,才会调用三次析构函数,如果不加[],编译器不知道是数组,以为只有一个,只执行一次析构,造成内存泄漏。
侯捷老师c++面向对象高级编程相关推荐
- 侯捷老师-02面向对象高级编程
侯捷老师-02面向对象高级编程 1.Static使用 Static本质 Static使用 Static使用举例-单例模式 Static使用举例-单例模式(改进) 2.模板使用 Class Templa ...
- 侯捷老师-01面向对象高级编程
侯捷老师-01面向对象高级编程 01面向对象高级编程 1.编程习惯 总结 2.三大函数 2.1 拷贝构造函数.拷贝赋值函数.析构函数(带有指针的类) 2.2 构造函数.析构函数 局部变量.全局变量 3 ...
- 【C++】侯捷:C++面向对象高级编程(上)
C++面向对象高级编程(上) 文章目录 C++面向对象高级编程(上) 一.学习目标 1.1 关于C++ 1.1.1 C++的历史 1.1.2 C++演化 1.1.3 C vs C++ 二. C++类的 ...
- 【侯捷】C++面向对象高级编程(上)
一.C++编程简介 1.1 目标 培养正规的.大气的编程习惯 以良好的方式编写C++ class [Object Based(基于对象)] class without pointer members ...
- 侯捷老师 c++面向对象编程(上)
(本博客是笔者根据侯捷老师的课程进行的总结,便于自己复习,也分享于网上,便于和更多人学习交流,若有侵权,请告删,若有误,请不吝赐教)(图来自于pdf文档,需要的朋友可以在评论区留言) 主要分为两章: ...
- 一、C++面向对象高级编程(上) (侯捷)
侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...
- c++面向对象高级编程 总目录
本文是对学习侯捷视频 c++面向对象高级编程系列博客的目录总索引. c++面向对象高级编程 学习一 不带指针的类: 访问私有成员变量的方式,内联inline,常量成员函数,构造函数,值传递,引用传递, ...
- 侯捷C++课程笔记01: 面向对象高级编程(上)
本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(上) pdf版本笔记的下载地址: 笔记01_面向对象高级编程(上),排版更美观一点(访问密码:3834) 侯捷C++课程笔记01: 面向对象高 ...
- 侯捷C++课程笔记02: 面向对象高级编程(下)
本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(下) pdf版本笔记的下载地址: 笔记02_面向对象高级编程(下),排版更美观一点(访问密码:3834) 侯捷C++课程笔记02: 面向对象高 ...
- 侯捷面向对象高级编程(二)
侯捷面向对象高级编程(二) 转换函数 转换函数没有返回值,返回值就是double即函数名,不需要自己写 因为转换函数一般不会改变其中内容,所以要加const限定 两条路都可以走,就回产生歧义,报错 e ...
最新文章
- python自学视频教程-私藏已久的7个Python视频教程
- 清空mysql一个库中的所有表_mysql怎样清空一个数据库中的所有表_MySQL
- JavaScriptSerializer序列化与反序列化--备忘
- 学校计算机教室的用途,录播教室有什么功能,又有哪些用途
- nginx配置url重写
- 年底双薪一般是什么时候发_评职称发表文章一般发什么刊物
- C# WinForm 判断程序是否已经在运行,且只允许运行一个实例
- tensorflow:卷积函数----tf.nn.conv2d
- [FZYZOJ 1889] 厨房救济
- 个人使用unity3d过程中遇到的一些小问题集合之有时候在场景中创建光源会有一条虚线...
- 【drawio笔记】为Confluence Cloud使用自定义字体
- arcgis地理配准_【更新70篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
- 使用Dev C++运行c语言代码时碰到Failed to executeC:\c++.cpp: Error 0 :操作成功完成
- Debian 查看 硬盘 SD卡 容量 内存大小
- Ubuntu16.04无法连接Wifi解决方案 (绝对有效)
- Java 序列化对象为json字符串,属性首字母大写,并按照属性首字母排序
- word中目录出现省略号疏密不一致
- 找回桌面清理向导清理多余IE图标
- Java企业级常见的设计模式
- ceph(ceph是什么意思)
热门文章
- Corosync双心跳冗余方案配置
- 3D设计软件中怎么快速建模?浩辰3D快速建模教程
- 传音控股前三季度研发投入稳步增加 “剑”指全球新兴市场技术变革新机遇
- shareSDK导入的常见错误及解决方法
- 嘉兴 机器人仓库 菜鸟_菜鸟在嘉兴推出全新智能仓 宣布将在双11启用超级机器人仓群...
- 《嵌入式 - 深入剖析STM32》详解STM32时钟系统
- QT 按钮保持按下时样式
- Please, configure Web Facet first!的解决办法
- MKMapView 自定义大头针
- Python工程师必备哪些技能 学习路线是什么