0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中申请的堆内存能不能自动释放

学益得智能硬件 来源:学益得智能硬件 2024-11-27 09:33 次阅读

C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。

学过 C++ 的同学,应该首先能想到智能指针。

但是这是C语言,没有类和对象、构造析构这些技术,想要自动释放很难。

下面给大家介绍一种黑科技

之前我们讲过 GNU 的 attribute 属性,里面可以是 packed unused 等等,还有一个,叫 cleanup。

cleanup的作用就是当其声明的变量离开了生命周期,就会调用指定的函数。

这刚好满足了我们的要求。

比如这样的代码,给 str 申请了内存,但是整个代码中也没有释放,妥妥的内存泄漏。

定义 str 的时候,可以在后面加上 attribute cleanup,指定函数 func,意思就是,当变量 str 生命周期结束的时候,会调用 func 函数。换句话说,只要 main 函数结束了,就会调用 func 函数。

func 函数有个参数,是变量 str 的地址,可以写成 char ** 类型,在函数的内部可以释放刚才申请的堆内存。

这样在 main 函数结束的时候,就会自动调用 func 函数释放堆内存,有点智能指针的意思。

有了 func 函数,在任意地方定义指针,只要加上 attribute 属性,函数运行结束,就能自动释放堆内存。

attribute 属性并不是 C 标准内容,属于 GNU 扩展功能,不过也不排除后面被加到标准里面的可能性。

了解一下就行,不建议使用,太过于冷门。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    3003

    浏览量

    73893
  • C语言
    +关注

    关注

    180

    文章

    7601

    浏览量

    136235
  • 函数
    +关注

    关注

    3

    文章

    4308

    浏览量

    62434

原文标题:堆内存也能自动释放

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中的头文件能不能重复包含

    C语言中的头文件能不能重复包含? 比如代码写成这样,stdio.h 连续包含了两次。 #include #include int main(){ printf("helloworld
    的头像 发表于 11-26 17:19 63次阅读

    使用C语言实现函数模板

      用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
    的头像 发表于 11-09 11:38 296次阅读

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。在C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 244次阅读

    一体成型电感外壳破损还能不能

    电子发烧友网站提供《一体成型电感外壳破损还能不能用.docx》资料免费下载
    发表于 10-31 10:57 0次下载

    UTB定位技术能不能精准定位

    在当今科技日新月异的时代,定位技术以其广泛的应用场景和不断提升的精度,成为了多个领域的核心支撑。其中,UTB定位技术以其高精度、低延迟和高抗干扰性等特点,在众多定位技术中脱颖而出,成为精准定位领域的佼佼者。那么,UTB定位技术到底能不能精准定位呢?下面就给大家具体介绍一下关于UTB定位技术。
    的头像 发表于 09-03 10:07 275次阅读

    请问esp32能不能自动找到信号最强的wifi ap进行连接?

    你好,我的设置好多wifi ap 热点,他们的ssid 和密码 都是相同。请问 esp32 能不能自动找到信号最强的wifi ap 进行连接。谢谢。
    发表于 06-13 07:33

    C语言中,同一个函数能不能被定义两次?

    稍微有点C语言基础的同学,一定知道不能这样做。
    的头像 发表于 05-11 18:27 1594次阅读

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈内存
    发表于 03-19 11:38 492次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>泄漏问题原理

    C语言中的动态内存管理讲解

    本章将讲解 C 中的动态内存管理。C 语言内存的分配和管理提供了几个函数。这些函数可以在 头文件中找到。
    的头像 发表于 02-23 14:03 375次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的动态<b class='flag-5'>内存</b>管理讲解

    同VLAN不同的网段能不能互通?

    同VLAN不同的网段能不能互通? 同一个VLAN中的设备拥有相同的网络地址范围,因此它们可以通过该VLAN进行通信。而不同VLAN中的设备拥有不同的网络地址范围,它们通常不能直接互通。然而,在某些
    的头像 发表于 02-04 11:21 2955次阅读

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C语言中,访问权限冲突异常通
    的头像 发表于 01-12 16:03 5165次阅读

    DC2100B/A能不能支持MATLAB/simulink自动代码生成?

    1、硬件方面,微控制器是主要有几种,计算能力如何,可以支持类似MPC的算法吗?能不能扩展DSP的控制器? 2、软件方面,能不能支持MATLAB/simulink自动代码生成?
    发表于 01-11 06:56

    pcb压合缓冲垫,究竟能不能让你的电路板更安全?

    pcb压合缓冲垫,究竟能不能让你的电路板更安全?
    的头像 发表于 12-27 10:13 841次阅读

    C语言中结构体能不能相加

    C语言中,结构体能不能相加?
    的头像 发表于 12-19 17:04 1218次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>结构体<b class='flag-5'>能不能</b>相加

    c语言中decimal的含义

    C语言中的“decimal”是一种数据类型,用于表示十进制数字。在C语言中,常用的数据类型有整数类型(int)、浮点类型(float和double)、字符类型(char)等,而deci
    的头像 发表于 11-30 10:57 2311次阅读