文章目录
1. 栈和堆有什么区别?
-
栈和堆都是用来程序存储数据的内存区域。栈是一种有限的内存区域,可以用来存储局部变量、函数调用信息等。堆是一种动态分配的内存区域,用于存储程序运行时动态分配的数据。
-
栈上的变量生命周期与其所在函数的执行周期相同,而堆上变量的生命周期由程序员显示控制,可以用(
malloc
或new
申请),使用(free
或delete
释放)。 -
栈上的内存分配和释放是自动的,速度较快。而堆上的内存分配和释放需要手动操作,速度相对较慢。
2. 什么是内存泄露?
- 内存泄露指的是 程序未能释放不再使用的内存;
- 如何防止内存泄露:将内存的分配封装在类中,构造函数申请内存,析构函数释放内存;使用智能指针。
3. 析构函数为什么是虚函数呢?
- 当派生类对象中有内存需要回收时,如果析构函数不是虚函数,不会触发动态绑定,只有调用基类的析构函数,导致派生类资源无法正确释放,造成内存泄露。
4. C/C++ 的编译过程?
-
🐧① 预处理:
宏替换:替换所有宏定义;
文件包含:将头文件 (#include
) 的内容插入到源文件中;
条件编译:根据条件编译指令决定哪些代码被编译;
移除注释:删掉所有注释; -
🐧② 编译:
编译器将预处理后的文件转换为汇编代码; -
🐧③ 汇编:
汇编器将汇编代码转换成为机器代码; -
🐧④ 链接:
将目标文件和库文件链接成最终的可执行文件;
5. #pragma once与#ifndef #define #endif 的区别
- 目的:都是为了防止头文件在编译过程中被多次包含,他们都能解决重复包含的问题。