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

    文章

    3173

    浏览量

    76114
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144605
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66837

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    和栈的区别

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

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

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

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

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

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

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

    STM32C031F4 FLASH存储器读写例程各位高能不能提供一个?

    STM32C031F4FLASH存储器 读写例程 各位高能不能提供一个谢谢大家
    发表于 03-13 07:37

    请问SPC5_STUDIO能不能用stellarllink进行连接?如何连接?

    SPC5_STUDIO能不能用stellarllink进行连接?如何连接?
    发表于 03-10 08:18

    stm32f103cbu6底部焊盘能不能连接到VSS?

    stm32f103cbu6底部焊盘能不能连接到VSS
    发表于 03-10 07:51

    分析C语言代码结构的设计问题

    来分析一个C语言代码结构的设计问题。 这段代码,使用了两次malloc,分别给 p1 和 p2 申请内存。用完后,内存
    的头像 发表于 02-11 09:31 666次阅读

    指针被释放后就变成了空指针吗

    ;}     这段代码大家看下有没有问题,能不能顺利运行? 前面三行都没有问题,指针 s 指向了一块内存,把字符串 helloworld 拷贝到
    的头像 发表于 01-22 09:23 645次阅读

    ADS8568能不能使用单电源供电?

    ADS8568能不能使用单电源供电,即HVSS接地,HVDD接+12V,能正常工作吗?我现在用的硬件模式,采不到数据。。
    发表于 01-17 06:14

    EE-62:在C语言中访问短字内存

    电子发烧友网站提供《EE-62:在C语言中访问短字内存.pdf》资料免费下载
    发表于 01-07 14:02 0次下载
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>语言中</b>访问短字<b class='flag-5'>内存</b>

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言中</b>的DSP:从<b class='flag-5'>C</b>调用汇编类成员函数

    请问ads1271能不能测量负电压?

    1.请问ads1271能不能测量负电压,现在的电路ainn接的是地,ainp接的被测量模拟量,当ainp为正的时候数值正确,当ainp为负值时数值接近于0. 2.手册里的data rate
    发表于 01-01 08:09

    C6748的McBSP接口能不能读ad1271的转化数据?

    AD1271可以工作在两种模式,一种是SPI;另一种是Frame Sync,我如果用C6748的McBSP接口能不能读ad1271的转化数据?
    发表于 01-01 07:22

    ADS1292R导联能不能共用?

    现在已经实现了ADS1298测量8通道心电型号,要加上呼气阻抗的测量功能,要求这两种同时测量,所以打算再用一片ADS1292R完成呼吸测量,这样的话有些导连需要共用,问题是:导联能不能共用?如果
    发表于 12-12 08:36