固生堂面试(C++)
1.裸指针导致内存泄漏如何处理,用过哪些智能指针,智能指针的原理是什么?
用智能指针托管内存,让系统自动释放,从根源解决泄漏。
用过的智能指针:
- std::unique_ptr (独占智能指针)
- std::shared_ptr (共享智能指针)
- std::weak_ptr (解决 shared_ptr 循环引用)
展开讲:
- 智能指针是一个栈上对象
- 构造时 接管裸指针
- 析构时 自动 delete 内存
- 栈对象离开作用域 自动调用析构
- 内存 100% 安全释放,不会泄漏.
std::unique_ptr (独占指针)
- 同一时间只有一个指针拥有对象
- 不能拷贝,只能移动(move)
- 最轻量、效率最高,和裸指针一样快
- 适用:单纯管理对象,不需要共享
unique_ptr<int> p1(new int(10)); unique_ptr<int> p2 = move(p1); // 转移所有权
std::shared_ptr (共享指针)
- 引用计数(reference count) 原理
- 多个指针共享同一个对象
- 计数 = 0 时才释放内存
shared_ptr<int> p1 = make_shared<int>(10); shared_ptr<int> p2 = p1; // 计数=2
优点:共享管理,缺点:循环引用会导致永远不释放 → 内存泄漏
std::weak_ptr (弱引用)
专门解决:shared_ptr 循环引用问题
- 不增加引用计数
- 不拥有对象,只 “观测” 对象
- 可以判断对象是否存活
解决循环引用:
A 引用 B,B 引用 A → 计数永远不为 0
把其中一个改成 weak_ptr → 问题解决。
shared_ptr 线程安全吗?
2.map 的底层原理是什么,与unorder_map的区别?
一、map 的底层原理
map 底层 = 红黑树(Red-Black Tree)
核心特点
- 红黑树是一种自平衡的二叉搜索树
- key 会自动排序(默认升序)
- 插入 / 删除 / 查找 时间复杂度 O (log n)
- 中序遍历是有序序列
- 不允许 key 重复
- 查找速度O(log n),插入 / 删除O(log n)。
二、unordered_map 底层原理
unordered_map 底层 = 哈希表(Hash Table)
核心特点
- 使用 哈希函数 计算 key 位置
- key 无序
- 查找 / 插入 平均 O (1),最坏 O (n)(哈希冲突)
- 内存占用比 map 大
- 迭代顺序不确定
- 查找速度O(1),插入 / 删除O(1)。
要key有序用 map,要快用 unordered_map。
3.调试sql的工具是什么,如何看索引失效?
EXPLAIN ,例如 EXPLAIN SELECT * FROM 表 WHERE 条件;
只看 2 个字段:key与type 。
4.InnoDB的底层原理是什么?
聚簇索引(Clustered Index)+ B+ 树。
5.为什么使用B+树
太晚了,没写完,明天继续... ...