c++ question

  • malloc calloc realloc new 区别
1
2
3
4
malloc向系统申请一块未初始化的内存,申请失败返回NULL,申请成功返回指向该内存的指针
calloc是在malloc的基础上初始化内存为'0'
realloc会重新分配内存大小
new分配错误会抛出异常,new操作流程:系统申请内存->构造函数->返回指向内存指针
  • new 避免分配错误抛出异常
1
c++11 中 int *p = new(std::nothrow) int(4) 来避免抛出异常
  • 使用delete 来释放delete[]内存泄漏问题
1
2
使用delete 来释放delete[] 是否有内存泄漏 取决于new 对象构造函数中是否存在内存分配
delete 只会回收系统分配的内存
  • 指针 引用 解引用 解地址
1
2
3
4
5
6
7
8
9
指针是变量,存储的是内存地址。可以进行修改
引用是别名,允许多个不同变量访问同一个地址,修改一处,其他都会被修改
解引用 *, 取地址 &
引用的底层实现是常量指针,常量指针在初始化的时候需要绑定指定对象,绑定之后不能修改指定对象
大部分情况下不能对引用解引用,除非是引用的是指针
int a = 0;
int *b = &a;
int* &c = b;
int c = *c;
  • 虚函数可以是inline函数吗?
1
2
虚函数在没有表现多态性的前提下可以是inline函数
inline是编译时期确定,多态是在运行期
  • constexpr volatile
1
2
3
4
5
6
7
constexpr变量 具有const 属性,在编译期求值
constexpr函数 被隐式转为内联函数
编译器在编译期对constepr的代码进行优化

volatile类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,遇到该关键字声明的变量,编译器对该变量的代码就不再进行优化
优化方式主要是从内存读取数据,不会读取寄存器中的备份(防止优化编译器把变量从内存装到CPU寄存器中)
使用场景:多线程中被几个任务共享的变量需要定义为volatile类型
  • static
1
2
3
4
5
6
7
8
9
10
11
static全局变量:全局存储区(静态存储区),整个运行期间一直存在,未初始化的static全局变量会被初始化为0,只在定义该变量的文件中有效
static局部变量:全局存储区(静态存储区),未初始化的static全局变量会被初始化为0,离开作用域并不会销毁,在内存中保留,下次访问值不变
static函数:static函数只是在当前文件中可见不能被其他文件所用,不会与其他文件中的同名函数冲突,static函数在内存中只有一份,普通函数在调用时会有一份拷贝在内存中
类的static数据成员:全局存储区(静态存储区),需要在类外单独分配空间,static数据成员不占用类的空间,需要在类外定义。static数据成员可以是不完全类型
class A
{
private:
static A a; //static成员可以是不完全类型
A a; //数据类型必须是完全类型
}
类的static函数成员:对static成员的访问不需要对象名,不能直接引用类中的非static成员(可以通过对象来引用),可以直接引用类中的static成员