c++ 面试题 (实时更新)
一、new 和 malloc区别
1、属性方面
new是关键字,需要编译器支持
malloc是库函数,包括其头文件即可
2、分配内存
new自动分配内存
malloc需要手动分配内存
3、返回类型
new返回对象类型的指针,是符合类型安全性的操作符
malloc返回一个void*,需要强制转换成需要的类型
4、分配异常
new默认抛出一个异常
malloc返回NULL
5、内存泄露
new可以检测出来是哪一行
malloc不能明确是文件的哪一行
二、static
1、存放区域
堆区:需要程序员手动申请手动释放
栈区:编译器自动分配内存自动释放
静态区:static修饰的变量存放区域,也存放全局变量,随着程序的终止而释放
2、局部静态变量
作用于当前函数,只在第一次调用时进行初始化,但不随着函数的结束而释放,但其他函数也不能调用此静态变量
便于程序的维护
3、全局静态变量
只作用于当前文件,
用extern修饰的全局变量,可以作用于其他文件
4、类中修饰成员变量
修饰的变量不会占用当前类的内存空间,即在静态区进行内存的分配
且也只会初始化一次
静态成员函数不能访问非静态(包括成员函数和数据成员),但是非静态可以访问静态。
因为静态对象是确定的所以可以访问,
但非静态对象可以通过类实例化很多,没办法确定,所以不可以访问
静态对象之间可以互相访问,都是确定的。
三、野指针
1、定义:
未被初始化的指针,由于未初始化,所以其指向的地址是随机的。
指针越界访问,也会导致成为野指针
指针指向的空间释放后未置空
2、避免野指针
定义指针时对指针进行初始化,可以置为NULL
在清空指针时也需要把指针置为NULL
避免指针越界
避免返回局部变量地址
使用指针前检查指针的有效性
四、指针和引用区别
1、指针:就是内存地址
2、引用:就是变量的别名,不开辟内存控件,与变量使用同一块内存空间
3、区别:
初始化:引用在定义时必须初始化,而指针不用,不过尽量初始化,避免野指针出现
引用在初始化一个实体后,就不能再引用其他实体了,指针可以指向其他内存地址
没有NULL引用,但有nullptr指针
引用自加是引用的对象加1,指针自加是向右偏移一个类型大小