C++ 岗的面试,题目几乎围着同一批东西转:new 和 malloc 有什么区别、虚函数到底怎么实现多态、智能指针各自解决什么问题、vector 扩容时发生了什么。腾讯、字节、百度、华为这几家,换了部门、换了面试官,问到的还是这几块。原因不复杂:C++ 把内存、对象生命周期、编译期行为都交给了程序员,面试官想知道你是只会写语法,还是真的清楚一行代码背后发生了什么。
这份合集从公开面经里把 C++ 方向反复出现的八股题抽出来重新归类,一共 205 道题,分九个主题。它只收 C++ 语言本身与 STL,操作系统、计算机网络、数据库这类公共基础不在这里展开,后端岗的完整高频清单可以对照后端开发高频面试题榜单。
怎么用这份题单:
- 题目后面括号里是近期实际问过这道题的大厂,不代表完整名单,也不代表没标注的公司不问
- C++ 八股的追问很有层次:先问"是什么",再问"底层怎么实现",最后问"什么时候会出问题"。只背结论,第二层就会卡住
- 内存管理、虚函数、智能指针、STL 容器底层这四块是几乎所有 C++ 岗的公共必考区,时间不够就先把它们吃透
主题导航:内存管理与指针 · 智能指针与 RAII · 面向对象与虚函数 · C++11 新特性与移动语义 · STL 容器与算法 · 关键字与类型转换 · 拷贝、构造与析构 · 编译链接与程序运行 · 多线程与手撕题
内存管理与指针
new和malloc有什么区别?(腾讯 / 百度 / 字节跳动)new/delete和malloc/free能不能混用?new出来的对象可以用free释放吗?(腾讯 / 百度)new和malloc分配的内存分别在哪个区?(字节跳动 / 小米)new和malloc的完整过程是什么,底层用了哪些系统调用?(京东 / 蚂蚁)- C++ 的内存管理是怎么做的?有哪些内存分配方式?(腾讯 / 华为 / 快手)
- C++ 程序的内存分区有哪些?各自存什么?(腾讯 / 字节跳动 / 华为)
- 除了堆和栈,还有哪些内存区?(腾讯 / 大疆)
- 堆和栈有什么区别?谁的效率更高?(腾讯 / 字节跳动 / 华为)
- 为什么要区分堆和栈?(字节跳动 / 网易)
static变量存储在哪个区?(字节跳动 / 腾讯 / 大疆)malloc的典型实现原理是什么?(腾讯 / 小红书 / 快手)malloc底层是怎么实现的,和mmap、brk是什么关系?(字节跳动 / 百度 / 腾讯)malloc分配大块内存和小块内存时用的系统调用一样吗?(百度 / 腾讯)malloc返回的是物理地址还是虚拟地址?(腾讯 / 百度 / 快手)- 什么是内存对齐,有什么好处?(腾讯 / 字节跳动 / 华为)
- 结构体的内存对齐规则是什么,怎么计算结构体大小?(华为 / 腾讯 / 小米)
- 给一个结构体让你算大小,怎么调整成员顺序来省内存?(大疆 / 华为 / 快手)
- 空类的
sizeof是多少,为什么?(腾讯 / 百度 / 快手) - 什么是内存泄漏?和内存溢出有什么区别?(百度 / 美团 / 字节跳动)
- C++ 里内存泄漏是怎么产生的,怎么避免?(华为 / 腾讯 / 字节跳动)
- 线上程序发生了内存泄漏,怎么排查和定位?(字节跳动 / 小红书 / 快手)
- 检测内存泄漏有哪些工具?(华为 / 字节跳动 / 阿里巴巴)
- 什么是野指针,产生的原因是什么,怎么避免?(字节跳动 / 腾讯 / 小米)
- 野指针和悬空指针有什么区别?(腾讯 / 字节跳动 / 华为)
- 指针和引用有什么区别?(华为 / 腾讯 / 百度)
- 指针和数组有什么区别?对数组和指针分别用
sizeof结果一样吗?(大疆 / 小鹏 / 字节跳动) const int*、int const*、int* const分别是什么意思?(百度 / 腾讯 / 大疆)strlen和sizeof有什么区别?(地平线 / 百度 / 字节跳动)- 程序出现段错误是什么原因,怎么定位?(蔚来 / 百度 / 腾讯)
- 怎么排查 C++ 程序的 core dump?(腾讯 / 京东 / 百度)
- C++ 和 Java 在内存管理上有什么区别?(百度 / 京东 / 华为)
面试官问「new 和 malloc 有什么区别?」,看浮窗当场给你什么
面试官一开口,浮窗就出要点和能直接念的回答,被追问也接得住。共享屏幕时对面看不见。
核心要点 new 会调构造函数而 malloc 只分配原始内存、new 失败抛 bad_alloc 而 malloc 返回空指针、new 按类型自动算大小、两套必须配对使用
参考回答 最本质的区别是 new 会调用构造函数,malloc 只分配一块原始内存。new 是运算符,底层一般先调 operator new 拿到内存,再在上面构造对象;delete 对应地先析构再释放。其次是失败处理不同:new 失败默认抛 std::bad_alloc,malloc 返回空指针。还有 new 按类型自动算大小、直接返回正确类型的指针,malloc 要自己算字节数再强转。所以两套必须配对使用,new 出来的对象用 free 释放会跳过析构,资源就泄漏了。
智能指针与 RAII
- 讲一下 C++ 的智能指针,有哪几种?(腾讯 / 字节跳动 / 百度)
- 为什么要用智能指针,它解决了什么问题?(字节跳动 / 腾讯 / 大疆)
- 智能指针为什么能自动释放内存?(腾讯 / 快手 / 美团)
- 智能指针的实现原理是什么?(腾讯 / 华为 / 字节跳动)
- 智能指针的底层结构是什么?(腾讯 / 字节跳动 / 华为)
- 说一下
unique_ptr、shared_ptr、weak_ptr各自的特点和使用场景。(腾讯 / 字节跳动 / 快手) unique_ptr是怎么实现的,为什么它是独占的?(腾讯 / 字节跳动 / 快手)shared_ptr的引用计数原理是什么?(字节跳动 / 腾讯 / 哔哩哔哩)shared_ptr的控制块里有哪些东西?(腾讯 / 字节跳动 / 京东)shared_ptr是线程安全的吗?(快手 / 字节跳动 / 百度)- 智能指针本身线程安全吗,项目里怎么保证安全?(字节跳动 / 小鹏 / 腾讯)
shared_ptr的循环引用问题是什么,怎么解决?(腾讯 / 网易 / 华为)weak_ptr的作用是什么,能不能访问资源?(字节跳动 / 百度 / 腾讯)weak_ptr内部是怎么借助shared_ptr实现的?(腾讯 / 哔哩哔哩 / 快手)make_shared和直接用裸指针构造shared_ptr有什么区别?(腾讯 / 百度 / 快手)shared_ptr有哪些优化手段?(腾讯 / 字节跳动 / 快手)- 智能指针有什么缺点?(腾讯 / 哔哩哔哩 / 滴滴)
- 实习或项目里用过哪些智能指针,怎么选?(腾讯 / 华为 / 快手)
- RAII 是什么,全称是什么?(美团 / 快手 / 字节跳动)
- 为什么 C++ 的资源管理几乎都围绕 RAII 展开?(字节跳动 / 百度 / 腾讯)
- 哪些标准库组件用到了 RAII?
- 析构函数里为什么不应该抛异常?(字节跳动 / 拼多多 / 网易)
面向对象与虚函数
- C++ 面向对象的三大特性是什么,分别怎么实现?(华为 / 百度 / 快手)
- 谈谈你对 C++ 封装、继承、多态的理解。(腾讯 / 华为 / 小米)
- C++ 的多态是怎么实现的?(腾讯 / 华为 / 字节跳动)
- 静态多态和动态多态有什么区别?(百度 / 腾讯 / 字节跳动)
- 虚函数是什么,有什么作用?(腾讯 / 字节跳动 / 华为)
- 虚函数的底层实现是什么?(腾讯 / 字节跳动 / 百度)
- 虚函数表是什么,作用和基本原理是什么?(腾讯 / 华为 / 美团)
- 虚函数表是每个对象一份还是每个类一份?(腾讯 / 字节跳动 / 快手)
- 虚函数表存放在内存的哪个区域?(腾讯 / 百度 / 网易)
- 虚函数表是什么时候生成的,虚表指针什么时候初始化?(腾讯 / 百度 / 字节跳动)
- 虚函数表和虚表指针怎么寻址?(快手 / 字节跳动 / 腾讯)
- 多重继承时虚函数表的内存分布是怎样的?(腾讯 / 快手 / 小米)
- 虚函数为什么能实现多态?(百度 / 快手 / 美团)
- 纯虚函数和抽象类是什么,为什么要用纯虚函数?(腾讯 / 华为 / 字节跳动)
- 虚函数和纯虚函数有什么区别?(腾讯 / 百度 / 华为)
- 构造函数能不能声明为虚函数?为什么?(腾讯 / 字节跳动 / 百度)
- 析构函数为什么要定义成虚函数?(腾讯 / 字节跳动 / 小米)
- 基类析构函数没写
virtual,用基类指针指向派生类对象会有什么问题?(字节跳动 / 京东 / 快手) - 析构函数在什么时候应该声明为虚函数?(字节跳动 / 快手 / 网易)
- 还有哪些函数不能声明为虚函数(内联函数、友元函数、静态成员函数)?(快手 / 腾讯 / 百度)
static成员函数能不能是虚函数?(腾讯 / 百度 / 美团)inline关键字可以用于虚函数吗?(腾讯 / 字节跳动 / 华为)- 构造函数和析构函数里能不能调用虚函数,会触发多态吗?(腾讯 / 字节跳动 / 网易)
- 子类重写了虚函数,父类构造函数里调用它会怎样?(字节跳动 / 小红书 / 网易)
- 重载、重写和隐藏有什么区别?(字节跳动 / 腾讯 / 百度)
- C++ 的函数重载是怎么实现的?(字节跳动 / 百度 / 腾讯)
- 构造函数和析构函数的调用顺序是怎样的(含继承)?(字节跳动 / 网易 / 华为)
- 销毁对象时子类和基类析构函数的调用顺序是什么?(腾讯 / 字节跳动 / 快手)
- 虚继承是什么,解决了什么问题?(网易 / 字节跳动 / 百度)
- 多重继承会带来哪些问题?(网易 / 字节跳动 / 腾讯)
public继承和private继承有什么区别?(腾讯 / 蔚来)struct和class有什么区别?(腾讯 / 字节跳动 / vivo)- C++ 有哪些设计原则?(腾讯 / 华为 / 美团)
- 构造函数里用初始化列表和函数体内赋值有什么区别?(腾讯 / 百度 / 拼多多)
const加在成员函数后面表示什么?(腾讯 / 小米 / 网易)
C++11 新特性与移动语义
- C++11 引入了哪些重要特性,你都用过哪些?(腾讯 / 百度 / 字节跳动)
- 说说 C++11 的新特性,并介绍一下智能指针。(美团 / 腾讯 / 华为)
- 什么是左值,什么是右值?(腾讯 / 网易 / 字节跳动)
- 左值引用和右值引用有什么区别?(腾讯 / 百度 / 字节跳动)
- 右值引用可以用来做什么,它在 C++11 里解决了什么问题?(腾讯 / 华为 / 快手)
- 右值引用的作用和底层实现是什么?(腾讯 / 阿里巴巴 / 美团)
- 什么是移动语义?(快手 / 网易 / 腾讯)
- 移动构造函数和拷贝构造函数有什么区别?(网易 / 微软 / 百度)
std::move的作用和底层原理是什么?(字节跳动 / 腾讯 / 快手)std::forward和std::move分别用在什么场景?(字节 / 大疆 / 小红书)- 什么是完美转发,怎么实现?(字节跳动 / 哔哩哔哩 / 腾讯)
emplace_back和push_back有什么区别?(腾讯 / 字节跳动 / 百度)lambda表达式的捕获方式有哪些,底层是什么?auto和decltype的区别是什么?nullptr相比NULL好在哪?- 什么是 C++ 模板,模板编译之后是什么样子?(腾讯 / 字节跳动 / 米哈游)
- 模板特化和偏特化是什么?
- C++ 里的原子变量是怎么实现的?(百度 / 腾讯 / 小米)
- C++ 协程用过吗?(滴滴 / 百度 / 腾讯)
- C++ 和 Java 有哪些主要区别?(字节跳动 / 腾讯 / 阿里巴巴)
- C 和 C++ 的主要区别是什么?(华为 / 字节跳动 / 腾讯)
- C++ 和 Go 的区别是什么?(腾讯 / 字节跳动 / 百度)
- C++ 里怎么使用 C 语言的库?(华为 / 哔哩哔哩 / 拼多多)
STL 容器与算法
- STL 有哪些容器,各自的特点和适用场景?(华为 / 小米 / 百度)
- 序列容器和关联容器分别有哪些?(字节跳动 / 阿里巴巴 / 美团)
- 讲一下 STL 某个容器的底层实现原理。(百度 / 腾讯 / 华为)
vector的底层实现是什么?(百度 / 华为 / 字节跳动)vector是怎么扩容的,扩容时内部会发生什么?(腾讯 / 华为 / 快手)vector怎么判断应该扩容(size和capacity的区别)?(字节跳动 / 快手 / 百度)vector扩容有什么问题,为什么push_back可能让迭代器失效?(腾讯 / 美团 / 字节跳动)vector的push_back时间复杂度是多少,均摊复杂度怎么算?(字节跳动 / 小红书 / 网易)vector插入、删除、查找的时间复杂度分别是多少?(百度 / 腾讯 / 中兴)vector是线程安全的吗?(百度 / 京东 / 美团)- STL 容器是线程安全的吗?(美团 / 哔哩哔哩 / 小米)
vector和list有什么区别?(腾讯 / 字节跳动 / 华为)vector和list怎么选,遍历速度哪个更快?(腾讯 / 华为 / 字节跳动)vector和deque有什么区别?(腾讯 / 华为 / 大疆)deque的底层是怎么实现的?(网易 / 华为 / 哔哩哔哩)- 数组和
vector有什么区别?(美团 / 华为 / 小米) map的底层是什么,为什么用红黑树?(腾讯 / 字节跳动 / 哔哩哔哩)map的底层为什么用红黑树而不用 AVL 树?(腾讯 / 字节跳动 / 网易)unordered_map的底层是怎么实现的?(腾讯 / 华为 / 字节跳动)map和unordered_map有什么区别?(百度 / 腾讯 / 小米)map和unordered_map各自的优势和使用场景是什么?(腾讯 / 网易 / 字节跳动)map与unordered_map的增删改查复杂度分别是多少?(腾讯 / 字节跳动 / 小米)unordered_map的哈希冲突是怎么处理的?(腾讯 / 百度 / 华为)unordered_map是怎么扩容的?(快手 / 美团 / 腾讯)set和unordered_map的区别是什么?(影石 / 华为)- 红黑树的特点是什么,为什么说它是弱平衡?(百度 / 快手 / 美团)
- 红黑树和平衡二叉树(AVL)有什么区别?(美团 / 腾讯 / 字节跳动)
- 红黑树相比普通二叉搜索树有什么优势?(华为 / 美团 / 拼多多)
- 红黑树是怎么通过旋转和变色保持平衡的?(百度 / 字节跳动 / 快手)
- 往红黑树里插入一个节点的过程是什么?(网易 / 京东 / 百度)
- 红黑树在哪些场景里会用到?(华为 / 美团 / 腾讯)
string的底层是怎么实现的?(美团 / 华为 / 百度)sort的底层是怎么实现的?(美团 / 腾讯 / 字节跳动)- STL 是怎么管理内存的?(字节跳动 / 腾讯 / 网易)
- 迭代器失效有哪些场景?
关键字与类型转换
static关键字有哪些用法?(字节跳动 / 小米 / 腾讯)static修饰全局变量和不修饰有什么区别?(大疆 / 字节跳动 / 百度)static变量的初始化发生在什么阶段?(腾讯 / 美团 / 大疆)- 在头文件里定义
static变量会有什么问题?(字节跳动 / 拼多多 / 百度) const关键字有什么作用,应用场景有哪些?(华为 / 腾讯 / 哔哩哔哩)const和static有什么区别?(腾讯 / 华为 / 百度)const和#define宏有什么区别?(字节跳动 / 大疆 / 华为)const修饰成员函数是什么意思,const是左结合吗?(腾讯 / 快手 / 小米)volatile的作用是什么?(美团 / 字节跳动 / 百度)volatile能保证原子性吗?(美团 / 华为 / 字节跳动)volatile是怎么限制编译器优化的,什么场景必须用?(字节跳动 / 大疆 / 小鹏)- 访问硬件寄存器、中断变量时为什么常常要用
volatile?(大疆 / 小鹏) inline关键字有什么优缺点?(腾讯 / 华为 / 大疆)inline和#define有什么区别?extern关键字有什么作用?(腾讯 / 字节跳动 / 百度)extern "C"有什么作用?(腾讯 / 字节跳动 / 百度)- C++ 有哪四种类型转换?(腾讯 / 字节跳动 / 百度)
static_cast和dynamic_cast有什么区别,转换失败分别会怎样?(腾讯 / 快手 / 蔚来)dynamic_cast依赖什么机制才能工作?- 强制类型转换有什么风险?
#define宏有什么缺点?typedef和using有什么区别?
拷贝、构造与析构
- 深拷贝和浅拷贝有什么区别?(美团 / 字节跳动 / 百度)
- 在 C++ 里怎么实现深拷贝?(华为 / 字节跳动 / 滴滴)
- 什么时候需要自定义拷贝构造函数?(小鹏 / 美团 / 字节跳动)
- 什么情况下会调用拷贝构造函数?(华为 / 百度 / 网易)
- 拷贝构造函数的参数为什么必须是引用?
- 赋值运算符重载要注意哪些问题(自赋值、异常安全)?
- 什么是三五法则(Rule of Three / Five)?
- 构造函数和析构函数分别有什么作用?(华为 / 理想 / 腾讯)
- C++ 析构函数是什么时候被调用的?(华为 / 字节跳动 / 快手)
- 如何禁止一个类被拷贝,如何禁止在栈上或堆上创建对象?
- 什么是 explicit 关键字,作用是什么?
- 友元函数是什么,有什么利弊?
- 对象的内存布局是什么样的(含虚表指针和成员变量)?
编译链接与程序运行
- C++ 的编译过程分哪几步,每一步生成什么?(腾讯 / 字节跳动 / 百度)
- 预处理阶段做了哪些事?(大疆 / 阿里巴巴)
- 从 C++ 源码到可执行文件的完整过程是什么?(字节跳动 / 小红书 / 快手)
- 静态链接和动态链接有什么区别?(字节跳动 / 华为 / 腾讯)
- 静态库和动态库有什么区别?
- 头文件里的
#ifndef和#pragma once有什么区别? - 一个程序运行起来,内存布局是怎样的?(腾讯 / 字节跳动 / 美团)
- C++ 的内存模型是什么?(腾讯 / 蔚来 / 华为)
- C++ 的未定义行为有哪些常见例子?
- 内联函数、模板、虚函数对代码体积和性能分别有什么影响?
多线程与手撕题
- C++ 怎么创建一个线程?
- C++ 里常见的锁有哪些,读写锁怎么使用?(字节跳动 / 小红书 / 网易)
mutex、lock_guard和unique_lock有什么区别?- 条件变量怎么用,为什么要配合循环判断?
- 死锁产生的条件是什么,怎么避免?
thread_local是什么,有什么用?- 手写
memcpy,要考虑内存重叠。(腾讯 / 华为 / 字节跳动) memcpy和memmove有什么区别?(华为 / 腾讯 / 蔚来)- 手写
strcpy,strcpy会有什么安全问题?(腾讯 / 华为 / 蔚来) - 手写一个
shared_ptr。 - 手写
vector的核心实现(扩容、拷贝、移动)。 - 手写单例模式,怎么保证线程安全?
- 手写
string类,包含拷贝构造和赋值运算符。 - 手写线程池。
笔试机考碰上这类手撕代码题
不用切屏:鼠标在「解题」按钮上停 1.2 秒,AI 读完题,把思路、复杂度和代码直接贴在考试页上方。
实现 void* my_memcpy(void* dst, const void* src, size_t n),要求源和目标内存有重叠时结果依然正确。
示例:char s[] = "abcdef"; my_memcpy(s + 2, s, 4) → s 变为 "ababcd"
AI 会自动截屏并解答
也可以直接按 Ctrl+Alt+Shift+Enter,手不用离开键盘
备考重点
C++ 八股的核心区别在于它考的是"这行代码背后发生了什么",不是"语法怎么写"。内存管理和虚函数是出现频率最高的两块,几乎每场 C++ 岗面试都会碰到,但很少停在"是什么",追问会落到"虚函数表在内存哪个区、什么时候生成""new 底层调了什么""智能指针的控制块里有什么"。这几个底层问题能讲清楚,整个 C++ 面试的基础就稳了。
建议按这条主线准备:先把一个对象从创建到销毁的全过程走一遍(内存分配、构造函数、虚表指针初始化、析构、释放),再顺着每一步补"为什么"和"出问题会怎样"。内存对齐、sizeof、构造析构顺序这些容易被忽略的小题,实际上经常作为现场口述或手写题出现,值得单独过一遍。
C++11 之后的内容(智能指针、右值引用、移动语义、lambda)已经是常规必考项,不是加分项。能说清"移动语义省掉了哪一次拷贝"比背出右值引用的语法更能拿分。如果目标是后端或基础架构岗,STL 容器的底层实现(vector 扩容、unordered_map 哈希冲突、红黑树)加上多线程与锁,会是权重更高的一组;而嵌入式、自动驾驶和机器人方向的岗位,则更偏重 volatile、内存对齐、extern "C" 和链接这类贴近底层的题。
常见问题
这份题单是怎么整理出来的?
来源是公开面经,把 C++ 方向反复出现的八股题抽出来重新归类,不包含面灵用户的面试内容。括号里标注的是近期实际问过这道题的大厂,只作参考,不代表完整名单。
C++ 面试八股应该先准备哪些部分?
优先顺序建议是:内存管理(堆栈、new/malloc、内存泄漏)→ 虚函数与多态 → 智能指针 → STL 容器底层(vector、map、unordered_map)→ C++11 新特性。这五块是各大厂 C++ 岗的公共必考区,剩下的关键字、编译链接、多线程再按目标岗位补。
面试官问虚函数,一般会追问到什么程度?
通常是三层:先问什么是虚函数、怎么实现多态,再追问虚函数表和虚表指针的存放位置与生成时机,最后落到边界问题,比如构造函数能不能是虚函数、析构函数为什么要写成虚函数、构造函数里调用虚函数会怎样。能画出带虚表指针的对象内存布局,比背结论更容易拿分。
没有 C++ 项目经验,这部分怎么准备?
优先吃透原理和对比关系(new 对 malloc、unique_ptr 对 shared_ptr、map 对 unordered_map),这是追问最集中的区域。再自己手写一遍简化版的 shared_ptr 和 vector,跑通之后再回答细节问题会踏实很多。
更多岗位合集
运维面试题 / 运维八股 Top 25:运维与基础架构岗高频面经热度榜(2026 年 10 月版)
运维、SRE、基础架构岗位公开面经整理:25 道高频运维面试题与八股,标注热度等级和近期出题的知名大厂,附 Linux、网络、K8s、容器的答题框架。
深度学习面试题与八股文汇总:192 道 Transformer、CNN、RNN 高频真题分类整理(2026 面经)
面灵AI整理的深度学习八股合集,覆盖反向传播与归一化、Transformer 与自注意力、位置编码、BERT 与 GPT、FlashAttention 与 MoE、CNN 与目标检测、RNN 与 LSTM、生成模型,标注近期实际出题的大厂。
机器学习面试题与八股文汇总:154 道经典算法真题分类整理(2026 面经)
面灵AI整理的机器学习经典八股合集,覆盖过拟合正则化、模型评估、集成学习、无监督聚类、优化与损失函数、强化学习基础,标注近期实际出题的公司,算法岗和大模型岗都会被追问到。