C---内存管理

一、内存分配情况
这里写图片描述

  • 数据区(静态区):保存自动全局变量和 static 变量(包括 static
    全局和局部变量)。静态区的内容,在整个程序的生命周期内都存在,由编译器在编译的时候分配
  • :保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
  • :由 malloc 系列函数或 new 操作符分配的内存。其生命周期由 free 或 delete
    决定。在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错

二、什么是野指针?
野指针是指向被释放的内存或者没有访问权限的内存的指针
解决办法:释放完内从之后将指针置NULL;

三、常见的内存错误以及对策

1、指针没有指向一块合法的内存(也就是定义了变量后没有为指针分配内存)
解决办法: 函数的入口校验, 如assert(NULL!=ptr)
注意:assert 是一个宏,而不是函数,包含在 assert.h 头文件中。如果其后面括号里的值为假, 则程序终止运行,并提示出错;如果后面括号里的值为真,则继续运行后面的代码。
2、为指针分配的内存太小,导致出现越界错误
场景:

char *p1 = “abcdefg”;  
char * p2 = (char* )malloc(sizeof(char)*strlen(p1));
strcpy(p2,p1);

p1 是字符串常量,其长度为 7 个字符,但其所占内存大小为 8 个 byte。初学者往往忘 了字符串常量的结束标志“\0”。这样的话将导致 p1
字符串中最后一个空字符“\0”没有被 拷贝到 p2 中。
解决的办法是加上这个字符串结束标志符:

 char *p2 = (char*)malloc(sizeof(char)*strlen(p1)+1*sizeof(char));

3、内存分配成功,但并没有初始化 解决方案:在定义指针的时候就初始化。
如 int *ptr=NULL;

4、内存越界 ,内存分配成功,且已经初始化,但操作越过了内存的边界。
场景:由于操作数组或者指针时出现多“1”,少“1”的情况。
解决办法:for循环的循环变量一定要在半开半闭的区间,并且循环变量尽量从0开始。

5、内存泄漏: 没有释放开辟出来的内存。造成系统内存的浪费

造成内存泄漏的原因:

  • 执行malloc函数分配内存后,没有检验内存分配失败情况。 注意:如果申请的内存大于目前堆上的剩余内存,malloc就会分配内存失败。
  • malloc出来的内存在最后没有被free释放,或者malloc了两次,只free了一次;

6、内存已经释放,仍通过指针来使用
解决办法:内存被释放后,将指针置为NULL;

详细内容看《C语言深度解剖》

猜你喜欢

转载自blog.csdn.net/ddcodingya/article/details/81740451