动态内存的释放与回收函数:free()的详解与使用

简介: 动态内存的释放与回收函数:free()的详解与使用

上个博客,笔者讲解了动态内存开辟函数:malloc函数!但是,仅仅光开辟空间还是不够的,如果一直进行空间的开辟,却不进行回收与释放,那么,再大的硬盘容量也经不起霍霍!!所以:动态内存的释放与回收函数:free()显得尤为重要!!


在C语言中,提供了一个函数:free()函数,专门用来做动态内存开辟空间的释放与回收的!!函数原型如下:


0a2653c851af460fa595bd959398a8f1.png


void free (void* ptr)

free函数用来释放动态开辟的内存!!

1.如果参数ptr执行的空间,不是动态内存开辟的,那么free()函数的行为是未定义的!!

2.如果参数ptr是NULL指针,则函数什么事都不用做!

malloc函数与free函数都是定义在:#include <stdlib.h>这个头文件中!!

将free与malloc函数的联用情况:


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main()
{
  int* p = (int*)malloc(40);
  int* ptr = p;
  if (ptr == NULL)
  {
  printf("%s\n", strerror(errno));
  return 1;
  }
  //使用
    //自行添加使用的代码!!
  //释放
  free(p);  
  p = NULL;
}


在这个代码中,就是将malloc函数与free函数初步联用!!所以才能更合理的分配内存!!


但是在malloc函数与free函数联用的情况,由于代码的不规范,也会出现或多或少的错误!!


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int test ()
{
  int* p= (int*)malloc(40);
  if (p == NULL)
  {
  printf("%s\n", strerror(errno));
  return 1;
  }
  //使用
  if (1)
  {
  //某个成立的条件!
  return 2;
  }
  //释放
  free(p);
  p = NULL;
}//该段代码,存在内存泄露的问题!
int main()
{
  test();
  return 0;


其实,在该段代码中,可能出现内存泄漏的问题!!


原因在于:在该段代码中:


 

//使用
  if (1)
  {
  //某个成立的条件!
  return 2;
  }

如果条件成立,直接返回该值,但并不会继续执行代码,导致,后续的释放(//释放    free(p);    p = NULL;)出现问题!


相关文章
|
9天前
|
存储 算法 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)
`memcpy()` 和 `memmove()` 是C语言中的两个内存操作函数。 `memcpy()` 函数用于从源内存区域复制指定数量的字节到目标内存区域。它不处理内存重叠的情况,如果源和目标区域有重叠,结果是未定义的。函数原型如下: ```c void *memcpy(void *dest, const void *src, size_t num); ```
27 6
|
5天前
|
Java
DirectMemory内存回收
DirectMemory内存回收
10 0
|
5天前
|
存储 算法 C语言
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
14 0
|
6天前
|
C语言
C语言(11)----内存函数
C语言(11)----内存函数
11 1
字符串和内存函数(下)
字符串和内存函数(下)
|
6天前
|
C++
字符串和内存函数(上)
字符串和内存函数(上)
|
6天前
|
存储 测试技术 C语言
C语言内存管理函数研究
C语言内存管理函数研究
15 0
|
7天前
|
C语言
C语言内存操作函数
C语言内存操作函数
13 1
|
9天前
|
存储 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (二)
`memset()`是一个C语言库函数,用于将指定内存区域的字节设置为特定值。函数原型为`void *memset(void *ptr, int value, size_t num)`,参数分别为指向内存起始位置的指针、要设置的值和设置的字节数。`memcmp()`函数则用于比较两个内存区域,返回值表示比较结果,原型为`int memcmp(const void *ptr1, const void *ptr2, size_t num)`。它比较指定字节数的内存,并根据比较结果返回整数值。
25 4
|
10天前
|
存储 安全 编译器
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
12 0
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)