第二章 C语言动态内存管理
动态内存的分配
- malloc与free一起必须成对出现
- 避免内存泄漏
- 丢失了内存的地址
- 隐式泄漏:没有对使用完的空间进行释放。例如定义了动态成员变量的结构体,只释放了结构体指针,而没有释放成员指针
动态内存释放函数
函数名 | 作用 |
---|---|
malloc |
分配内存空间,使用最多,函数返回内存区域第一个字节的地址 |
realloc |
重新分配内存空间,用于扩展和缩小空间 |
calloc |
分配空间并清空,等同于malloc +memset |
memset |
清空内存区域 |
free |
释放内存区域 |
使用
malloc
可能会返回空指针,所以可以加一步判断int *pi = (int* ) malloc (sizeof(int)); if(pi != NULL) { // Pointer should be good } else { // Bad pointer }
realloc
函数的特殊性可以让其有多种功能
第一个参数 | 第二个参数 | 行为 |
---|---|---|
空 | 无 | 同malloc |
非空 | 0 | 原内存块被释放 |
非空 | 比原内存块小 | 利用当前位置分配更小的块 |
非空 | 比元内存块大 | 在当前位置或其他位置分配更大的块 |
迷途指针
如果原内存被释放,但是原指针确仍然指向原来区域,那么该指针则被称为迷途指针。迷途指针最好的解决办法就是将释放后的指针置为NULL
动态分配内存的监控
正由于动态分配的内存存在大量的陷阱,因此产生了很多工具来监视和检测迷途指针和内存泄漏等。以下是书中介绍的工具和技术,具体可以查看相应网站