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 扩展功能,不过也不排除后面被加到标准里面的可能性。

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

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

    关注

    9

    文章

    3234

    浏览量

    76512
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146143
  • 函数
    +关注

    关注

    3

    文章

    4422

    浏览量

    67841

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    能不能通过气味来判断三防漆是否环保?

    行业内判断三防漆的环保与否,有着明确的核心依据,与气味大小毫无关联。能不能通过气味来判断三防漆是否环保?行业内衡量三防漆环保性的关键标准,是是否符合欧盟ROHS指令
    的头像 发表于 03-17 17:13 364次阅读
    <b class='flag-5'>能不能</b>通过气味来判断三防漆是否环保?

    keil中c语言的动态分配内存

    于处理器的指令集中,效率很高,但是分配的内存容量有限。另外,当函数运行结束时,栈区的空间会被自动释放。 (3)内存映射段。该部分内存主要用于
    发表于 01-21 06:04

    C语言嵌入式系统编程注意事项-内存操作

    字节为单位编址,而C语言指针以指向的数据类型长度作自增和自减。理解这一点对于以指针直接操作内存是相当重要的。 函数指针 首先要理解以下三个问题: (1)C
    发表于 01-04 07:31

    请问C语言中整形溢出的解决方法有哪些?

    C语言中整形溢出的解决方法有哪些?
    发表于 12-29 07:33

    单片机c语言中定义字节怎么定义?

    定义位可以用***it但是定义字节呢?还有就是比如汇编中的DPTR的DPH和DPL在c语言中怎样定义的呢?
    发表于 12-29 06:32

    请问C语言中整形溢出会产生哪些异常行为?

    C语言中整形溢出会产生哪些异常行为?
    发表于 12-26 07:05

    嵌入式C语言中各变量存储位置

    的了解比较精准。经常需要操作的内存可分为以下几个类别: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、
    发表于 12-25 07:54

    请问C语言中整形溢出对哪些应用场景影响较大?

    C语言中整形溢出对哪些应用场景影响较大
    发表于 12-24 08:24

    C语言中可以嵌套汇编语言吗?

    请问C语言中可以嵌套汇编语言吗?
    发表于 12-15 08:14

    C语言内存池使用

    C语言内存管理,从来都是一个让人头秃的问题。要想更自由地管理内存,就必须去申请,然后还需要
    发表于 12-11 07:57

    和栈的区别

    一个由C/C 编译的程序占用的内存分为以下几个部分: 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作
    的头像 发表于 11-27 18:13 1231次阅读

    到底DDR走线能不能参考电源层啊?

    虽然我看到过DDR的走线参考电源平面也能调试成功的案例,但是依然不妨碍我还想问:到底DDR走线能不能参考电源层啊?
    的头像 发表于 11-11 17:44 898次阅读
    到底DDR走线<b class='flag-5'>能不能</b>参考电源层啊?

    使用MCU200T的板子能不能做RVSTAR上的实验例子?

    手里只有一块MCU200T的板子,看到老师做的RVSTAR上的例子,不知道能不能在MCU200T上面做
    发表于 11-05 12:55

    工厂设备能不能工业数采?3招教你快速判断,省时又省钱!

    设备能不能采?记住这五招:看接口、问协议、查灯亮、找厂家、加传感器。大部分现代工厂设备(PLC/CNC/注塑机),甚至部分干燥机、模温机,都是能采的!别被“老设备”吓住。
    的头像 发表于 07-03 10:09 904次阅读
    工厂设备<b class='flag-5'>能不能</b>工业数采?3招教你快速判断,省时又省钱!

    cyw20829能不能使用红外线解码吗?

    cyw20829能不能使用红外线解码吗
    发表于 07-03 06:49