1. 项目概述
作为一名在C++领域摸爬滚打多年的开发者,我深知大厂面试中对C++核心概念的考察深度。最近帮几位朋友准备面试时,发现内存管理和多态原理这两个主题几乎出现在所有一线互联网公司的技术面中。本文将基于我参与过的数十场技术面试(既作为面试者也作为面试官)的经验,深度解析这两个核心主题的考察要点和背后的原理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 内存管理深度解析
2.1 内存分区模型
C++程序运行时内存分为以下几个区域:
- 栈区(Stack):由编译器自动分配释放,存放局部变量、函数参数等。栈内存分配运算内置处理器的指令集中,效率高但容量有限
- 堆区(Heap):由程序员手动分配释放(new/delete),若未正确释放会导致内存泄漏。分配速度相对较慢但容量大
- 全局/静态区:存放全局变量和静态变量,程序结束后由系统释放
- 常量区:存放字符串常量和其他常量
- 代码区:存放函数体的二进制代码
面试高频问题:请解释栈和堆的区别?什么情况下会导致栈溢出?
2.2 new/delete与malloc/free的底层差异
虽然都能用于动态内存分配,但它们的区别远不止语法层面:
-
本质区别:
- malloc/free是C标准库函数
- new/delete是C++运算符
-
底层行为差异:
cpp复制// new的完整工作流程:
MyClass* obj = new MyClass();
// 等价于:
void* mem = operator new(sizeof(MyClass)); // 分配内存
obj = static_cast<MyClass*>(mem); // 类型转换
obj->MyClass::MyClass(); // 调用构造函数
// delete的完整工作流程:
delete obj;
// 等价于:
obj->~MyClass(); // 调用析构函数
operator delete(obj); // 释放内存
- 异常处理:
- new在分配失败时会抛出std::bad_alloc异常
- malloc失败时返回NULL
2.3 内存泄漏检测实战
常见内存泄漏场景:
