动态内存的释放与回收函数: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;)出现问题!


相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
11天前
|
程序员 开发者
分代回收和手动内存管理相比有何优势
分代回收和手动内存管理相比有何优势
|
27天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
30天前
|
算法 Java 程序员
内存回收
【10月更文挑战第9天】
42 5
|
1月前
|
Java 测试技术 Android开发
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
本文介绍了Java中四种引用类型(强引用、软引用、弱引用、虚引用)的特点及行为,并通过示例代码展示了在内存充足和不足情况下这些引用类型的不同表现。文中提供了详细的测试方法和步骤,帮助理解不同引用类型在垃圾回收机制中的作用。测试环境为Eclipse + JDK1.8,需配置JVM运行参数以限制内存使用。
32 2
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
154 1
|
22天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
19 0
|
1月前
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
39 0