欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C---内存管理

程序员文章站 2024-03-23 12:10:52
...

一、内存分配情况
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语言深度解剖》