c++面试准备
一、内存管理:
1️⃣malloc 和 new的区别
malloc和new都是用来分配内存的,malloc返回void类型的指针,所以分配内存后需要强制转换指针类型。new直接返回所需类型的指针。
2️⃣智能指针[c++11标准]
1.std::unique_ptr
独占所有权,对象的所有权在指针之间转移时,原指针会失去对象所有权
2.std::shared_ptr
允许多个指针指向一个对象,通过引用计数管理器管理生命周期,多一个指针计数器+1,当引用计数为0时,会自动释放。
3.std::week_ptr
弱指针用于解决循环引用问题
用于解决循环引用问题
循环引用:比如a引用的classA指向了b指向的classB,当main函数结束时,a和b的引入计数都没有变成0,两个类的析构函数都不会被调用,导致内存泄露。
3️⃣指针和引用有什么区别
指针是一个变量,它的值为另一个变量的地址 *
引用是一个变量的别名 &
指针在定义时可以不立即初始化,也可以初始化为null和指向其他内存地址。引用在定义时必须初始化,且一旦初始化就不能再引用其他变量。
二、面向对象
- 什么是封装、继承和多态
1️⃣封装
隐藏内部实现的细节,只暴露必要的接口。
2️⃣继承
允许一个类基于另一个类拓展功能,实现代码的复用和层次化设计。
3️⃣多态
接口统一,形式多样化。
值传递 和 引用传递、指针传递
三、STL
容器 算法
容器
vector是数组,list是双向链表
set和map都是红黑树,set是集合,map是键值对
vector的动态扩容机制
当vector容量不足时会申请一块更大的内存区域,通常为当前内存大小的两倍,将旧元素拷贝到新空间,然后释放旧内存。扩容会导致地址变化,迭代器失效。
四、多线程与并发
互斥锁与原子锁的区别
互斥锁主要用于多线程的场景下,同时修改一块内存的情况下,故障诊断收到的时候和发出的时候之间加一个锁