经典的动态内存错误(下)

简介: 目录上篇:(3条消息) 经典的动态内存错误(上)_执久呀的博客-CSDN博客四、用free函数释放非动态内存函数开辟的空间 1.程序崩溃如图所示:五、多次用free释放同一空间六、动态内存函数申请空间后未进行释放(导致内存泄漏) 1.细致观看内存泄漏的方法:

四、用free函数释放非动态内存函数开辟的空间


我们都知道,动态内存函数在堆区,


局部变量在栈区,全局变量在静态区


微信图片_20220105132108.png


#include<stdio.h>
#include<stdlib.h>
int main()
 {  
  int arr[10] = { 0 };
  int *p = arr;//p指向arr首元素地址
  for (int i = 0; i < 10; i++)
  {
     int kc=*(p + i) = i;
     printf("%d  ", kc);
  }
  free(p);//用了free释放在栈空间上的错误,会导致程序崩溃
  p = NULL;
  system("pause");
  return 0;
 }


用了free函数堆区释放在栈空间上的内存,导致程序崩溃


1.程序崩溃如图所示:


微信图片_20220105132135.png


所以我们在使用free函数时要先判断是不是动态内存函数申请的空间(malloc  calloc   realloc)。


五、多次用free释放同一空间


使用了free多次释放同一指针指向申请的内存空间。


#include<stdio.h>
#include<malloc.h>
int main()
{
  int*p=(int*)malloc(5*sizeof(int));
 if(p!=NULL)
  {
    for(int i=0;i<5;i++)
       {
          *(p+i)=i;
          printf("%d ",*(p+i));
       }
  }
  else 
   {
    return 0;
   }
     free(p);//两次释放导致程序出错
     free(p);
     p=NULL;
   return 0;
}


这种情况容易出现在有许多代码(且前面忘了使指针为NULL),前面释放过后,p还是指向原位置。再次释放时为非法了,所以进行free函数释放时,记得free(p)后,要将p=NULL;这样就不会出错了,即使在进行n次释放也无所谓了,因为当释放的值是NULL时,free函数什么也不做。


如下改正:

#include<stdio.h>
#include<malloc.h>
int main()
{
  int*p=(int*)malloc(5*sizeof(int));
 if(p!=NULL)
  {
    for(int i=0;i<5;i++)
       {
          *(p+i)=i;
          printf("%d ",*(p+i));
       }
  }
  else 
   {
    return 0;
   }
     free(p);//free(p);和p=NULL配套使用就没问题
     p=NULL;
   return 0;
}


六、动态内存函数申请空间后未进行释放(导致内存泄漏)


写一个极端点的例子效果更明显


#include<stdio.h>
#include<stdlib.h>
int main()
{
   while(1)
    {
       int *=(int*)malloc(4);死循环申请4个字节来模拟多次使用动态内存函数不释放   
    }
   return 0;
}


这个采用放大的思想将多次使用动态内存函数申请内存空间而不释放的场景


这个代码运行之后我们可以看到内存并不断减少。具体操作看下图


细致观看内存泄漏的方法:


微信图片_20220105132352.png微信图片_20220105132352.png微信图片_20220105132315.png


1.屏幕下方右击鼠标找到任务管理器:


2.找到性能


微信图片_20220105132352.png


3.代码运行后观看内存的变化(涨到一定内存后由于系统的保护将不再涨了)


微信图片_20220105132420.png


这就是全部动态内存的问题。




目录
相关文章
|
1月前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
5月前
|
C语言
C语言学习记录——动态内存开辟常见的错误
C语言学习记录——动态内存开辟常见的错误
33 1
|
6月前
|
存储 安全 编译器
常见的动态内存错误总结(一)
该文讨论了C语言中与动态内存和指针相关的常见问题。首先,强调了对NULL指针解引用的危险性,示例展示了未检查动态内存分配结果导致的问题,并指出`free()`函数传入NULL是安全的。接着,通过代码解释了指针传值调用时的陷阱,说明了为何直接调用`GetMemory(str)`无法改变`Test`函数中`str`的值。文章还提到了动态内存的越界访问和非法释放,包括释放非动态内存、只释放内存的一部分以及重复释放同一块内存的错误情况。最后,建议在释放内存后将指针设为NULL以防止后续误用。
61 1
|
6月前
关于动态开辟内存的经典笔试题
关于动态开辟内存的经典笔试题
28 0
|
6月前
6个常见的动态内存的错误和动态内存经典笔试题
6个常见的动态内存的错误和动态内存经典笔试题
“野指针”和大厂经典的动态内存错误笔试题
“野指针”和大厂经典的动态内存错误笔试题
|
程序员 C语言 C++
动态内存管理之经典笔试题
动态内存管理之经典笔试题
80 0
动态内存经典笔试题详解!!!
动态内存经典笔试题详解!!!
|
编译器 C语言
解密动态内存管理的奥秘(含内存4个函数)
解密动态内存管理的奥秘(含内存4个函数)
81 0
解密动态内存管理的奥秘(含内存4个函数)
动态内存分配— —常见错误总结
动态内存分配— —常见错误总结