【嵌入式八股3】C++:内存管理与指针
1. static
关键字的作用及与 C 的区别
static
关键字在 C++ 中主要影响变量或函数的 生命周期、作用域 和 存储位置。其具体影响如下:
1.1 修饰局部变量
- 存储位置:从 栈区 转移到 静态区。
- 生命周期:从局部生命周期变为全局生命周期。
- 作用域:作用域保持为局部范围,即函数内或代码块内。
1.2 修饰模块内的全局变量(静态全局变量)
- 存储位置:存储于 全局数据区的静态区。
- 作用域:作用域从 整个程序 限制为 当前文件。即使使用
extern
声明,也无法访问。 - 生命周期:生命周期保持为程序执行期间。
1.3 修饰函数
- 作用域:函数的作用域从 整个程序 限制为 当前文件。即使使用
extern
声明,也无法访问。
1.4 修饰 C++ 成员变量
- 类外定义与初始化:例如,
int A::_count = 0;
,类内声明为static int _count;
。 - 共享性:该静态成员变量为该类的所有对象所共享。
- 访问:通过
类名::成员变量名
进行访问。
1.5 修饰 C++ 成员函数
- 无
this
指针:静态成员函数没有隐式的this
指针。 - 访问限制:不能访问非静态成员(变量或函数)。
- 调用限制:静态成员函数不能调用非静态成员函数,但非静态成员函数可以调用静态成员函数。
2. 指针与引用的区别
2.1 定义区别
- 指针:指向一个对象,可以间接操作该对象。
- 引用:目标变量的别名,可以直接操作。
int a = 996;
int *p = &a; // p是指针,&获取地址
int &r = a; // r是引用,&仅为标识符
2.2 主要区别
- 初始化:引用必须初始化,而指针不必。
- 修改:引用初始化后不可修改所引用的对象,而指针可以修改所指向的对象。
- 递增操作:指针递增操作是改变地址,引用递增操作是改变值。
sizeof
:指针的sizeof
是指针的大小,引用的sizeof
是数据的大小。
2.3 类型转换
- 指针转换为引用:通过
*p
进行解引用,作为参数传入即可。 - 引用转换为指针:通过
&
取地址即可。
3. 深拷贝与浅拷贝
3.1 浅拷贝
- 浅拷贝是指增加了一个指向相同堆区的指针,这会导致在析构时重复释放相同的内存。
- 默认的拷贝构造和赋值运算符通常执行的是浅拷贝。
3.2 深拷贝
- 深拷贝是指在拷贝时,分配新的内存空间,并将内容复制到新的内存中。这样避免了在析构时重复释放内存的问题。
4. new
与 malloc
的区别
new
malloc
语法 | int *p = new int(0) 或 int *p = new int |
int *p = (int*)malloc(sizeof(int)) |
初始化 | 可以初始化 | 不会初始化 |
函数与运算符 | 操作符,返回指定类型的 |
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式八股/模拟面试拷打 文章被收录于专栏
一些八股模拟拷打Point,万一有点用呢