内存泄露问题,对于新手而言是不可避免的,也不应该躲避讨论。
C或C++,这一切都必须你自己来处理,即使经验丰富的老手也免
不了犯错。
定义指针变量的同时初始化为NULL
静态区:保存自动全局变量和static 变量(包括static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容
也会自动被销毁。其特点是效率高,但空间大小有限。
堆:由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定。
在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。
不管什么时候,我们使用指针之前一定要确保指针是有效的
一般在函数入口处使用assert(NULL != p)对参数进行校验
assert 是一个宏,而不是函数,包含在assert.h 头文件中。如果其后面括号里的值为假,
则程序终止运行,并提示出错;如果后面括号里的值为真,则继续运行后面的代码。这个
宏只在Debug 版本上起作用,而在Release 版本被编译器完全优化掉,这样就不会影响代码
的性能。
为指针分配了内存,但是内存大小不够,导致出现越界错误。
char *p1 = “abcdefg”;
char *p2 = (char *)malloc(sizeof(char)*strlen(p1));
strcpy(p2,p1);
少分配了’\0’所占的内存
定义变量的同时初始化
int i = 0;
char *p = NULL;
int a[10] = {0};
内存泄漏
Malloc之后使用指向这块内存的指针时,必须用if(NULL != p)语句来验证内存确实分配成功了。
用malloc 函数申请0 字节内存不会返回NULL 指针,但无法使用
多次free会出错,free之后重新把指针的值变为NULL
释放完块内存之后,没有把指针置NULL,这个指针就成为了“野指针”