搜索
bottom↓
回复: 17

離開Malloc時,要怎麼釋放? 或是不需要釋放?

[复制链接]

出30入8汤圆

发表于 2020-8-13 00:37:29 | 显示全部楼层 |阅读模式
/* string_concat [字串相加]
* 將 str1 與 str2 相加,並返回新的字串
* */  
char *string_concat(char *str1, char *str2) {  
   // 計算所需的陣列長度  
   int length=strlen(str1)+strlen(str2)+1;  
     
   // 產生新的陣列空間  
   char *result = (char*)malloc(sizeof(char) * length);  
     
   // 複製第一個字串至新的陣列空間  
   strcpy(result, str1);  
   // 串接第二個字串至新的陣列空間  
   strcat(result, str2);  
     
   return result;  
}  
  

請問,這範例使用到了 Malloc,那麼離開這個副程式時,要怎麼釋放? 或是不需要釋放?
謝謝。

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入8汤圆

发表于 2020-8-13 03:05:59 | 显示全部楼层
是一定要释放,要不然就内存泄露了。
比如ptr=string_concat(a,b);
free(ptr);

出0入296汤圆

发表于 2020-8-13 04:02:35 | 显示全部楼层
这个函数调用了malloc,当使用完这个函数所产生的字符串以后,你是一定要释放的,直接用free(<该函数所返回的的地址>); 就可以释放了。

不过这个函数其实是有问题的,就是没有检测malloc返回值是NULL的情况。

出10入46汤圆

发表于 2020-8-13 09:27:58 | 显示全部楼层
这种写法是非常危险的。 很容易忘记free。
看别人程序,程序复杂点,找free点,都找半天。

出0入0汤圆

发表于 2020-8-13 10:20:56 | 显示全部楼层
一般不建议这样做,而是函数外部分配内存然后作为参数传递给函数,更安全的做法是传递内存指针和长度两个参数给函数。C语言一旦用了malloc这种动态分配内存的方法就要很注意指针的生存期问题(malloc后什么时候free)。

出0入59汤圆

发表于 2020-8-13 10:25:27 | 显示全部楼层
pc 上可以直接用c库中malloc 和 free
单片机上,ram一般不大,需要有专门内存管理模块才能用,否则会出现内存碎片,长时间运行后碎片太多,然后malloc不出大块内存

出300入477汤圆

发表于 2020-8-13 12:15:24 来自手机 | 显示全部楼层
这是设计错误。
这种函数总是应该设计为外面传入结果缓冲区和长度。如果外面不知道传多少长度可以写0,函数自己返回所需的结果缓冲区长度,然后外面分配正确长度的缓冲区再调用一次。

出0入0汤圆

发表于 2020-8-13 15:36:22 | 显示全部楼层
一定要么用也可以,free也放本函数内,这样就有个缺点,运行效率不高。每次进来都malloc,free
/* string_concat [字串相加]
* 將 str1 與 str2 相加,並返回新的字串
* malloc失败时返回NULL
* */  
char *string_concat(char *str1, char *str2)
{  
    static char *result=NULL;
   
    // 計算所需的陣列長度  
    int length=strlen(str1)+strlen(str2)+1;  
     
    // 產生新的陣列空間  
    if(result!=NULL)
    {
        free(result);
    }
    result = (char*)malloc(sizeof(char) * length);
    if(result==NULL)
    {
        return NULL;
    }
     
    // 複製第一個字串至新的陣列空間  
    strcpy(result, str1);  
    // 串接第二個字串至新的陣列空間  
    strcat(result, str2);  
     
    return result;  
}  

出0入984汤圆

发表于 2020-8-13 16:24:49 | 显示全部楼层
我习惯临时字符串开在栈上

出0入0汤圆

发表于 2020-8-13 16:29:08 | 显示全部楼层
xjavr 发表于 2020-8-13 15:36
一定要么用也可以,free也放本函数内,这样就有个缺点,运行效率不高。每次进来都malloc,free
/* string_co ...

不能这么用,你不知道返回的指针会在哪里用,里边给释放了之后就变成野指针了

不管是里边 malloc() 还是外边 malloc() 后再传进来,只要保证该释放的时候一定给释放掉就可以
只是从 C 语言的习惯用法来说,除非是本身就负责内存空间管理的函数,一般都是传入一个已经分配好的空间

出0入0汤圆

发表于 2020-8-13 16:45:27 | 显示全部楼层
wudicgi 发表于 2020-8-13 16:29
不能这么用,你不知道返回的指针会在哪里用,里边给释放了之后就变成野指针了

不管是里边 malloc() 还是 ...

说的是呀,这不是正确的用法,要这么搞局限性就很大了。

出30入8汤圆

 楼主| 发表于 2020-8-13 19:16:13 | 显示全部楼层
拜謝各位神仙大爺指導,晚輩受教了。

出0入296汤圆

发表于 2020-8-14 09:26:53 | 显示全部楼层
看了大部分人的回复,突然对嵌入式行业的软件水准产生了信心。

出0入0汤圆

发表于 2020-8-22 16:28:17 来自手机 | 显示全部楼层
你们这是害楼主啊,还是师从郭德纲?
楼主是想把两个字符串接在一起,但是到底存放在哪里这个问题,你们不好好告诉楼主

楼主你的函数名叫 char *string_concat(char *str1, char *str2)
你应该传一个内存地址做参数进来,不应该让这个函数负责申请内存,那你如果在这个函数里面申请内存,就要把新内存的地址传出去,在外面释放,这样子操作不是不可以,而是不合理,子债父还的感觉

Caller函数调用string_concat函数,你就在caller函数里先申请好内存,把新内存地址传进string_concat函数,caller完事了再把这个新内存再释放掉,这样做,谁开苞谁负责,比较合理

所以我建议的函数原型是
char string_concat(char* dest, char *str1, char *str2)

出16170入6148汤圆

发表于 2020-8-23 12:20:55 来自手机 | 显示全部楼层
 【請教 Malloc 的釋放問題】标题不合格。标题不合格,这次我帮你修改了。你是VIP++不用警告。
    标题必须充分说明帖子内容
     比如你要问AVR的ADC如何才能测量得比较准确,使用标题:“AVR的ADC如何消除干扰测量得比较准确?”。以下的标题不合格:
           不合格举例1:小女子冰天雪地裸体跪求解决方法
          不合格举例2:高手请出招,一个无法解决的AVR问题
          不合格举例3:一个困扰学习单片机初学者,惊动单片机开发者的难题 
          不合格举例4:AVR的ADC测量   (点评:问问题,或是有技术心得与大家分享?)

出0入0汤圆

发表于 2020-8-23 20:52:47 | 显示全部楼层
Brooklyn 发表于 2020-8-22 16:28
你们这是害楼主啊,还是师从郭德纲?
楼主是想把两个字符串接在一起,但是到底存放在哪里这个问题,你们不 ...

你这个方法最合理的,函数就负责功能,有利于降低耦合和后期维护代码

出20入30汤圆

发表于 2020-8-23 21:01:11 来自手机 | 显示全部楼层
学习了。

出30入8汤圆

 楼主| 发表于 2020-8-24 13:38:02 | 显示全部楼层
armok. 发表于 2020-8-23 12:20
 【請教 Malloc 的釋放問題】标题不合格。标题不合格,这次我帮你修改了。你是VIP++不用警告。
    标 ...

感謝管理員不殺之恩,小弟下回會注意。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-17 06:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表