文章目录
本文来源《高质量C++编程》第7章
内存分配方式
- 从静态存储区域分配
- 在栈上创建
- 从堆上分配(动态内存分配)
堆与栈的区别
指针与数组
指针与数组区别
- 修改内容
- 内容复制与比较
- 计算内存容量
delete/new和free/malloc
- malloc和free是c++/c语言的标准库函数,new和delete是c++的运算符
- free和delete:把指针所指的内存给释放掉,并没有把指针本身干掉
- malloc和free
void *malloc(size_t size);
int *p = (int*)malloc(sizeof(int)*length);
//1.类型转换:返回类型是void*,显示转换
//2.sizeof
- free
free(p):p是NULL指针,free对p操作多少次都不会出问题,p不是NULL指针,free对p连续操作两次会运行错误
- new和delete
int *p1 = (int*)malloc(sizeof(int)*length);
int *p2 = new int[length];
- new创建对象数组,只能使用对象的无参构造函数
Obj *obj = new Obj[100]; //√
Obj *obj = new Obj[100](1); //×
delete[]obj; //√
delete obj; //× 相当于delete obj[0];
野指针
“野指针”不是NULL指针,是指向“垃圾”内存的指针。
- 出现:
- 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,缺省值是随机的。指针变量在创建的同时应当被初始化,要么设置为NULL,要么指向合法内存。
- 指针p被free或delete后没有置为NULL。
- 指针操作超越了变量的作用范围。
内存耗尽
动态分配内存时,new和malloc找不到足够大的内存快时返回NULL。
处理方法:
- 判断指针是否为NULL,是->return
- 判断指针是否为NULL,是->exit(1)
- 设置异常处理函数