变量的声明和定义的区别
变量的声明仅告知编译器名称与类型,不分配存储空间;而定义会实际分配空间并创建实体。一个变量可被多次声明(如使用 extern),但只能定义一次。需注意,若 extern 修饰的变量带有初始化语句,则该语句被视为定义。
内存泄露是什么意思?怎么避免内存泄露
内存泄漏指程序动态申请内存后失去控制,导致无法释放资源。这会造成内存占用持续增长,性能下降,严重时引发崩溃或服务宕机。
避免方案包括:
- 遵循 RAII(资源获取即初始化)原则,利用对象生命周期自动管理资源。
- 优先使用智能指针或 STL 容器替代裸指针。
- 确保
new/delete或malloc/free成对出现。 - 释放内存后将指针置空,防止悬空指针。
怎么排查内存泄漏,遇到内存泄漏情况,一般怎么解决
排查时先通过监控系统观察运行中内存是否持续上涨且无法回落。其次在测试环境稳定复现问题,配合工具定位。常用手段包括:
- 使用 Valgrind 或 AddressSanitizer 等工具检测未释放块。
- 分析堆栈跟踪信息,定位具体代码行。
- 针对循环引用场景,检查智能指针的使用逻辑。 解决时通常结合 RAII 重构代码,或手动补充释放逻辑。
说一下 define 和 const 的区别
#define 是预处理宏,无类型检查,直接文本替换;const 是类型安全的关键字,有作用域限制。宏在编译前展开,可能产生副作用;const 变量参与类型检查,调试更友好。
define 和 typedef 的区别
#define 用于定义常量或宏,本质是文本替换;typedef 用于为现有类型创建别名,发生在编译阶段,具有类型安全性,推荐用于复杂类型别名。
宏函数和内联函数的区别
宏函数由预处理器处理,无类型检查,参数替换可能导致意外行为;内联函数由编译器处理,有类型检查,支持调试,执行效率接近宏但更安全。
类和结构体的区别
主要区别在于默认访问权限:类的成员默认为 private,结构体默认为 public。功能上两者基本等价,可根据语义选择使用。
结构体 (struct) 和联合体 (union) 差别
结构体各成员独立分配内存,总大小为成员之和(含对齐);联合体所有成员共享同一块内存,大小取决于最大成员。
静态库和动态库区别
静态库在编译链接时复制到目标文件,体积较大但依赖少;动态库在运行时加载,节省空间但需确保运行时环境存在对应库文件。
介绍一下 C++ 的编译过程
主要分为四步:
- 预处理:展开宏、包含头文件。
- 编译:语法检查、生成汇编代码。
- 汇编:生成目标文件(.o/.obj)。
- 链接:合并目标文件与库文件,生成可执行程序。


