c++基础速刷,查漏补缺(四)

速刷知识点,可用来查漏补缺

C++强制类型转换
关键字:static_cast, dynamic_cast, reinterpret_cast, cosnt_cast
1. static_cast
没有运行时类型检查来保证转换的安全性
进行上行转换(把派生类的指针,引用 转换为基类)是安全的。
进行下行转换,因为派生类可能有不属于基类的变量,所以是不安全的。
总结:静态转换,需要程序员自己确定转换的安全性
2.dynamic_cast
具有类型检查(信息在虚函数中),更安全。转换后必须是类的指针、引用或者void*,基类要有虚函数。
dynamic本身只能用于存在虚函数的父子关系的强制类型转换;对于指针,转换失败则返回nullptr,对于引用,转换失败会抛出异常。
总结:当父类需要使用子类的函数,且父类自身的该函数不能设置为虚函数时(如果可以设置为虚函数,编译器会自动动态选择合适的版本)。使用时要加倍小心,尽量使用“定义虚函数”的方法。
3.reinterpret_cast
可以将整形转换为指针,也可以把指针转换为数组;可以在指针和引用间随意转换,平台移植性价比差。
4.const_cast
去掉类型的const或volatile属性。
总结:少用强制类型转换

C++内存模型
字符串操作函数
char *strcpy(char *strDest, const char *strSrc);
//把src字符串拷贝到dest字符串上。
int strlen(const char *str);
//计算给定字符串的长度
char *strcat(char *dest, cosnt char *src);
//把src接到dest字符串的后面。
int strcmp(const char * s1, const char * s2);
//比较大小。s1 < s2 返回负数 = 返回0, >  返回正数
内存泄露
定义:程序未能释放掉不再使用的内存的情况,称为内存泄漏。可以使用Valgrind,mtrace进行内存泄漏检查
分类:(1)堆内存泄露:开辟的堆内存没有释放。(2)系统资源泄露:程序使用系统分配的资源(Bitmap, handle, SOCKET等),没有使用相应的函数释放,导致系统资源的浪费。(3)没有将基类的析构函数定义为虚函数,导致子类没有正常释放
常见情况:指针改变指向,未释放动态分配的内存
措施:将内存的分配封装在类中,构造分配,析构释放;使用智能指针

地址空间分布
  1. 命令行参数和环境变量:从命令行执行程序时,程序员指定的参数
  2. 栈区:存储局部变量、函数参数值。从高地址向低地址增长的连续空间
  3. 文件映射区:绑定动态库等
  4. 堆区:动态申请的内存。从低地址向高地址增长
  5. BSS段:存储未初始化的全局变量和静态变量
  6. 数据段:存储已初始化的全局变量和静态变量
  7. 代码段:存放程序代码的内存区,只读,头部包含一些只读的常数变量。
静态存储区:编译时分配,生存周期为整个运行期间,如全局变量,static变量。
栈:执行函数时,函数的局部变量都可以在栈上创建,生存周期为函数的运行时间,自动释放。
堆:程序员自己申请(new, malloc)和释放(free,delete),生存周期由自己决定。




遇到不会的知识点,欢迎在回复中提问,我会在回复中回答,或者另写文章具体讲解。
祝大家都能在秋招中斩获心仪的offer。

感谢阅读。
全部评论
查漏补缺小能手
点赞
送花
回复
分享
发布于 2022-08-28 13:02 河南

相关推荐

2 6 评论
分享
牛客网
牛客企业服务