C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
2016-03-12 11:03
405 查看
C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
(1)开辟的内存没有释放,造成内存泄露
(2)野指针被使用或释放
(3)非法释放指针
(1)开辟的内存没有释放。造成内存泄露,以下的样例就可能造成20个字节的泄露,内存泄露不是一个马上会引发故障的错误,可是
它将消耗系统内存。
(2)野指针被使用或释放
野指针是一个已经被释放的内存指针,他指向的位置已经被使用free或者realloc函数释放了,可是该指针依旧在使用。
正确的内存释放应该是以下的
(3)非法释放指针
上面的程序中,a[20]是一个栈上的数组。a是这块内存的地址;b是栈上面的一个变量。&b是它的地址。这些栈上的内存,编译器
将自己主动管理和回收资源,程序中使用free将他们释放,是一种错误的写法。
上面的一段程序。将内存释放两次是错误的写法,由于第一次释放后,该地址已经变成,未分配的堆内存。free函数不能释放未分配的堆内存。
在上面的程序中,尽管pa是一个被分配出的堆内存指针,pb作为pa的地址加1,也是一个堆内存的指针,并且这个指针所指向的也是已经分配的内存。然而内存pb依旧是非法的内存释放。这是因为这个指针并非从malloc分配出来的。而是中间的一个指针值。
(1)开辟的内存没有释放,造成内存泄露
(2)野指针被使用或释放
(3)非法释放指针
(1)开辟的内存没有释放。造成内存泄露,以下的样例就可能造成20个字节的泄露,内存泄露不是一个马上会引发故障的错误,可是
它将消耗系统内存。
void function1() { char *pa; pa = (char*)malloc(sizeof(char)*20); if(NULL !=pa) { strcpy(pa,”hello”); printf(“pa = %x\n”,(unsigned int)pa); printf(“pa = %s\s”,pa); } return; }
(2)野指针被使用或释放
野指针是一个已经被释放的内存指针,他指向的位置已经被使用free或者realloc函数释放了,可是该指针依旧在使用。
void function2() { char *pa; pa = (char*)malloc(sizeof(char)*20); if(NULL !=pa) { strcpy(pa,”hello”); printf(“pa = %x\n”,(unsigned int)pa); printf(“pa = %s\s”,pa); } free(pa); printf(“ pa = %s”,pa); return; }
正确的内存释放应该是以下的
void function2() { char *pa; pa = (char*)malloc(sizeof(char)*20); if(NULL !=pa) { strcpy(pa,”hello”); printf(“pa = %x\n”,(unsigned int)pa); printf(“pa = %s\s”,pa); } free(pa); pa = NULL; if(NULL != pa) { printf(“pa = %s\n”,(unsigned int)pa); } return; }
(3)非法释放指针
void function3() { char a[20]; int b; free(a); free(&b); return; }
上面的程序中,a[20]是一个栈上的数组。a是这块内存的地址;b是栈上面的一个变量。&b是它的地址。这些栈上的内存,编译器
将自己主动管理和回收资源,程序中使用free将他们释放,是一种错误的写法。
char *pa; pa = (char*)malloc(sizeof(char)*20); free(pa); free(pa);
上面的一段程序。将内存释放两次是错误的写法,由于第一次释放后,该地址已经变成,未分配的堆内存。free函数不能释放未分配的堆内存。
char *pa; char *pa; pa = (char*)malloc(sizeof(char)*20); pb = pa++; free(pb);
在上面的程序中,尽管pa是一个被分配出的堆内存指针,pb作为pa的地址加1,也是一个堆内存的指针,并且这个指针所指向的也是已经分配的内存。然而内存pb依旧是非法的内存释放。这是因为这个指针并非从malloc分配出来的。而是中间的一个指针值。
相关文章推荐
- 学习C++之类与对象
- C++中的main函数
- C语言-数组
- C语言—指针数组
- C/C++函数指针(typedef简化定义)
- 大数相关计算(c语言版)
- C语言实现希尔排序
- C语言中动态申请连续的二维数组
- 归并排序 C++实现
- C++构造函数详解及显式调用构造函数
- 小白第一次学C语言
- 孙敬哲的C++上机实验1-2
- 动态链表
- C++中引用(&)的用法和应用实例
- C-C++字符输出时遇到字符'\n','\0'区别
- C-C++字符输出时遇到字符'\n','\0'区别
- c++中 vs 简单的对txt文件读写
- 第三章字符串,向量,数组
- C++设计模式编程中的迭代器模式应用解析
- Wavefront OBJ 转换成OpenGL ES使用的C/C++文件