内存泄露问题,对于新手而言是不可避免的,也不应该躲避讨论。

     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之后使用指向这块内存的指针时,必须用ifNULL = p)语句来验证内存确实分配成功了。

malloc 函数申请0 字节内存不会返回NULL 指针,但无法使用

 

多次free会出错,free之后重新把指针的值变为NULL

释放完块内存之后,没有把指针置NULL,这个指针就成为了“野指针”