【C语言】free()函数详解(动态内存释放函数)

这篇具有很好参考价值的文章主要介绍了【C语言】free()函数详解(动态内存释放函数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🦄个人主页:修修修也

🎏所属专栏:C语言

⚙️操作环境:Visual Studio 2022

【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free


目录

 一.free()函数简介

1.函数功能

2.函数参数

void * ptr

3.函数返回值

4.函数头文件

二.free()函数的具体使用

1.使用free()函数完成malloc()开辟空间的释放

2.使用free()函数完成calloc()开辟空间的释放

3.使用free()函数完成realloc()开辟空间的释放

三.free()函数常见使用误区

1.对非动态开辟内存使用free释放

2.使用free释放一块动态内存的一部分

3.对同一块动态内存多次释放

4.动态开辟内存后忘记释放

结语


一.free()函数简介

我们先来看一下cplusplus.com - The C++ Resources Network网站上free()函数的基本信息:

【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free

1.函数功能

可以看到,free()函数的功能是:释放以前由malloc(),calloc(),realloc()函数动态开辟的内存空间.使其可以重新被分配.

2.函数参数

该函数有1个参数,是:

void free (void* ptr);

void * ptr

参数的类型无类型指针(void*),它指向先前由malloc(),calloc(),realloc()动态分配的内存块,它的作用是告诉函数要释放的内存块的起始位置.

3.函数返回值

函数的返回值类型空(void),它表示函数在运行结束后不需要返回值.

4.函数头文件

该函数包含在头文件<stdlib.h>中.

二.free()函数的具体使用

free()函数的使用场景是:当我们先前使用了malloc(),calloc(),realloc()函数开辟了动态内存空间,我们在不再使用这块空间时就应该及时使用free()函数将它释放掉,以免造成内存泄漏.

内存泄漏:如果动态开辟的内存没有被释放,那么这些内存就会一直占用系统资源,从而导致内存泄漏。内存泄漏会导致程序运行速度变慢,甚至崩溃。

1.使用free()函数完成malloc()开辟空间的释放

如下,我们使用free()函数将malloc()开辟空间的释放掉:

给free()函数传入:malloc()函数动态开辟的指针(即p).

int main()
{
    int* p = (int*)malloc(sizeof(int)*10);    //开辟10个整型大小空间
    if (p == NULL)       //如果开辟失败,则打印错误原因
    {
        //打印错误原因的一个方式
        printf("%s\n", strerror(errno));
    }
    else
    {
        int i = 0;
        for (i = 0; i < 10; i++)    //遍历赋值并打印这10个整型空间
        {
            *(p + i) = i;
            printf("%d ", *(p + i));
        }
        //可以正常使用p指针来操作这片空间了
    }

    free(p);    //释放p的内存空间
    p = NULL;         //将指针p置为NULL,防止其变成野指针

    return 0;
}

在vs编译器中运行查看结果:

【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free

虽然这里free()将malloc()动态开辟的内存释放后好像也没有发生什么变化,但如果我们因此不释放之前malloc()动态开辟的空间,那么这块空间就会一直占用着内存,既没有用,也没法让其他人使用.

还有一点需要注意的是,我们在free()完p指向的空间后,最好将p的内容置为NULL,否则这块空间已经被释放掉了,但你还保存着这块空间的地址,后续如果不小心再访问p的话,就会造成非法访问.


2.使用free()函数完成calloc()开辟空间的释放

如下,我们使用free()函数将calloc()开辟空间的释放掉:

给free()函数传入:calloc()动态开辟的内存指针(即p).

int main()
{
    int* p = (int*)calloc(10,sizeof(int));    //开辟10个整型大小空间
    if (p == NULL)       //如果开辟失败,则打印错误原因
    {
        //打印错误原因的一个方式
        printf("%s\n", strerror(errno));
    }
    else
    {
        int i = 0;
        for (i = 0; i < 10; i++)    //遍历并打印这10个整型空间
        {
            printf("%d ", *(p + i));//因为calloc()开辟的空间会自动初始化,所以我们可以不初始化这块空间,直接打印
        }
        //可以正常使用p指针来操作这片空间了
    }

    free(p);    //释放p的内存空间
    p = NULL;         //将指针p置为NULL,防止其变成野指针

    return 0;
}

在vs编译器中运行查看结果:

【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free

释放calloc()开辟的空间和malloc()一样,看不出来必要性,但却是非常有必要的.


3.使用free()函数完成realloc()开辟空间的释放

如下,我们使用free()函数将realloc()开辟空间的释放掉:

分别给free()函数传入:realloc()扩容后的内存块指针(即p).

int main()
{
    int* p = (int*)calloc(10,sizeof(int));    //开辟10个整型大小空间
    if (p == NULL)       //如果开辟失败,则打印错误原因
    {
        //打印错误原因的一个方式
        printf("%s\n", strerror(errno));
    }
    else
    {
        int i = 0;
        for (i = 0; i < 10; i++)    //遍历并打印这10个整型空间
        {
            printf("%d ", *(p + i));//因为calloc()开辟的空间会自动初始化,所以我们可以不初始化这块空间,直接打印
        }
        //可以正常使用p指针来操作这片空间了
    }
    printf("\n");
    p = (int*)realloc(p, 15 * sizeof(int));//将这块空间扩容到15个整型
    if (p == NULL)
    {
        printf("%s\n", strerror(errno));
    }
    else
    {
        int i = 0;
        for (i = 0; i < 15; i++)    //遍历并打印这15个整型空间
        {
            printf("%d ", *(p + i));
        }
    }

    free(p);    //释放p的内存空间
    p = NULL;         //将指针p置为NULL,防止其变成野指针

    return 0;
}

在vs编译器中运行查看结果:

【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free

realloc()扩容的内存块,扩容前的数据会保留,但新扩容的空间不会初始化,因此后面五个元素打印出的值是随机值.


三.free()函数常见使用误区

1.对非动态开辟内存使用free释放

因为p是由编译器分配到栈区的,不属于堆区,因此不能使用free释放.

void test()
{
    int a = 10;
    int *p = &a;
    free(p);      //p不是动态开辟的,不能释放
}

 使用vs2022测试一下:

【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free

可以看到,该错误导致了程序出错.

而图中的报错"已执行断点指令"则是因为代码执行过程中出现了未定义的非法行为.


2.使用free释放一块动态内存的一部分

如下代码:

void test()
{
    int *p = (int *)malloc(100);
    p++;
    free(p);        //p不再指向动态内存的起始位置
}

 在vs2022中测试一下:

【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free

可以看到,该错误导致了程序异常终止.


3.对同一块动态内存多次释放

如下代码:

void test()
{
    int *p = (int *)malloc(100);
    free(p);
    free(p);     //重复释放
}

 在vs2022中进行测试:【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free

可以看到,该错误导致了程序出错.

这里列出了两个防止重复释放的小技巧:

  • 在设计时尽量遵从:谁开辟,谁回收的原则
  • 在free完后立刻将原动态开辟的指针置为NULL.

4.动态开辟内存后忘记释放

如下代码:

void test()
{
    int *p = (int *)malloc(100);
    if(NULL != p)
    {
        *p = 20;
    }
    //没有释放!
}

int main()
{
    test();
}

 如果动态开辟的内存忘记释放,程序不会报错,但会造成内存泄漏!

忘记释放不再使用的动态开辟的空间会造成内存泄漏.

内存泄漏:如果动态开辟的内存没有被释放,那么这些内存就会一直占用系统资源,从而导致内存泄漏。内存泄漏会导致程序运行速度变慢,甚至崩溃。

因此:

动态开辟的空间一定要释放,并且正确释放!

动态开辟的空间一定要释放,并且正确释放!

动态开辟的空间一定要释放,并且正确释放!


结语

希望这篇free()函数详解能对大家有所帮助,欢迎大佬们留言或私信与我交流.

有关更多动态开辟相关知识可以移步:

【C语言】内存的动态分配与释放https://blog.csdn.net/weixin_72357342/article/details/134099965?spm=1001.2014.3001.5502

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【C语言】malloc()函数详解(动态内存开辟函数)

【C语言】realloc()函数详解(动态内存开辟函数)

【C语言】calloc()函数详解(动态内存开辟函数)

【C语言】free()函数详解(动态内存释放函数)

【C语言】memcpy()函数

【数据结构实战项目】C语言实现数据结构顺序表万字详解(附完整运行代码)

【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解)


【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free


C语言动态内存开辟相关库函数思维导图:

【C语言】free()函数详解(动态内存释放函数),C语言,c语言,开发语言,学习,笔记,动态内存开辟,free文章来源地址https://www.toymoban.com/news/detail-716971.html

到了这里,关于【C语言】free()函数详解(动态内存释放函数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言系列9——动态内存分配与释放

    在计算机编程中,动态内存分配与释放是一项重要的操作。本文将介绍malloc与free这两个基本操作,探讨内存泄漏的原因及避免策略,并通过实际案例讨论动态数组的创建与管理技巧。 动态内存分配是现代编程中的一个关键概念。与静态内存分配不同,动态内存分配允许程序

    2024年02月19日
    浏览(47)
  • 【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)

    本章重点 为什么存在动态内存管理 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 我们已经掌握的内存开辟方式有: int val = 20; //在栈空间上开辟四个字节 char arr[10] = {0}; 在栈空间上开辟十个字节的连续空间 但是上述开辟空间的方

    2024年02月03日
    浏览(47)
  • C语言 — 动态内存管理(动态内存函数)

    本期分为三篇介绍动态内存管理相关内容,关注博主了解更多 博主博客链接:https://blog.csdn.net/m0_74014525 本期介绍动态内存函数,函数如何使用、函数格式、在使用在所需要的注意点及C/C++程序的内存开辟区域 第一篇:C语言 — 动态内存管理(动态内存函数) 第二篇:C语言

    2024年02月14日
    浏览(45)
  • 【C语言】动态内存函数介绍

    目录 1.malloc和free 2.calloc 3.realloc   C语言提供了一个动态内存开辟的函数malloc: 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 ✔如果开辟成功,则返回一个指向开辟好空间的指针。 ✔如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做

    2024年01月22日
    浏览(33)
  • 动态分配内存与释放

    1.malloc malloc()可以找到一个大小合适的块。 内存是匿名的,也就是说,malloc()分配了内存,但没有为它指定名字。 格式如下: double*ptd; ptd=(double*)malloc(30*sizeof(double)); ps:ptd可以看成是一个数组。 malloc()可能分配不到所需的内存。在这种情况下,该函数返回空指针。

    2024年01月17日
    浏览(59)
  • C语言 malloc动态内存分配函数

    malloc函数:malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,就是当数组创建长度不一定 害怕数据存储不够或者不能浪费时间 在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。n在使用ma

    2024年02月07日
    浏览(44)
  • 动态内存函数malloc,calloc,realloc详解

    🍍个人主页🍍:🔜勇敢的小牛儿🚩 🔱推荐专栏🔱:C语言知识点 ⚠️座右铭⚠️: 敢于尝试才有机会 🐒今日鸡汤🐒: 出色一点 从能力到容貌 目录 思维导图: 一,malloc : 1.1:malloc函数简介: 1.2:malloc函数的使用:  代码: 二,calloc函数 2.1calloc函数简介: 2.2calloc函数

    2024年02月04日
    浏览(41)
  • 【c语言】详解动态内存管理

    回想一下我们之前学过的内存开辟方式: 在学习c语言时我们知道数据结构通常是固定大小的。就拿数组举例,一旦程序完成编译,那么 数组的大小及元素的个数就确定了 。那么在不修改程序并且再次编译程序的情况下就无法改变数据结构的大小。总结就是下面两个特点:

    2024年02月07日
    浏览(38)
  • 【C语言】动态内存管理详解

    目录 为什么存在动态内存分配 动态内存函数的介绍 malloc 和 free calloc realloc 常见的动态内存错误 对NULL指针的解引用操作 对动态开辟空间的越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟内存忘记释放(内

    2024年02月15日
    浏览(38)
  • 详解C语言—动态内存分配(二)

    目录 前言: 几个经典的例题题 例一: 例二: 例三: 例四: 例五:   C/C++程序的内存开辟 柔性数组 柔性数组的特点: 柔性数组的使用:  柔性数组的代替: 柔性数组的优势: 小结: 希望在复习完详解C语言—动态内存分配(一)​​​​​​​,阅读此篇文章会进一步提升

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包