函数外有分配内存的 char *outside,函数内有分配内存的 char *inside,如果先将 outside 所指的内存释放掉,然后将 inside 指针赋值给 outside,可行吗?函数结束后会被释放吗?有没有风险。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ReputationZh
V2EX    Linux

函数外有分配内存的 char *outside,函数内有分配内存的 char *inside,如果先将 outside 所指的内存释放掉,然后将 inside 指针赋值给 outside,可行吗?函数结束后会被释放吗?有没有风险。

  •  1
     
  •   ReputationZh 2020-09-23 17:39:59 +08:00 2422 次点击
    这是一个创建于 1852 天前的主题,其中的信息可能已经有所发展或是发生改变。

    示例:

    #include <stdio.h> #include <stdlib.h> #include <string.h> char *ptrToptr(char *outside) { char *inside = NULL; inside = (char *)malloc(200 * sizeof(char)); strcpy(inside, "inside"); free(outside); return inside; } int main() { char *outside = NULL; outside = (char *)malloc(100 * sizeof(char)); strcpy(outside, "outside"); outside = ptrToptr(outside); printf("%s\n", outside); free(outside); } 
    16 条回复    2020-09-27 09:58:07 +08:00
    jmc891205
        1
    jmc891205  
       2020-09-23 17:44:08 +08:00
    可行,函数结束后不会被释放
    风险就是手动管理内存导致的各种 bug
    Yut
        2
    Yut  
       2020-09-23 17:58:57 +08:00 via Android
    看起来意思只是重复使用 outside 这个 pointer ?一次是本身自己的一次是 inside 的?可以是可以,但是为啥一定要用 outside 那个 pointer 。。。
    zhangmenglong
        3
    zhangmenglong  
       2020-09-23 18:04:07 +08:00
    会被释放掉吧
    wscanf
        4
    wscanf  
       2020-09-23 19:13:53 +08:00
    可行啊。 不如直接说你的场景,看看有什么风险
    zmxnv123
        5
    zmxnv123  
       2020-09-23 19:26:44 +08:00 via iPhone
    你这都是堆上内存,不分函数内外。
    mybyons
        6
    mybyons  
       2020-09-23 21:44:6 +08:00
    如果不想自己被其他人打残 还是不要这么干
    rigortek
        7
    rigortek  
       2020-09-23 22:15:18 +08:00 via iPhone
    可行

    main 函数结束时,ptrToptr 分配的内存也被释放掉了。

    但是,根据函数功能单一原则,释放 outptr 的活应该在 main 中进行。

    因为内存是它分配出来的,根据内存管理一个一般性原则:谁分配谁负责释放。

    当然也有例外,如果你是 api 提供者,有时生命周期你无法掌控,此时由调用者负责释放。
    0TSH60F7J2rVkg8t
        8
    0TSH60F7J2rVkg8t  
       2020-09-23 23:20:43 +08:00 via iPhone
    这是作死行为,别这样玩,查起 bug 来要人命。你无法确定给你传 outside 指针的外部是什么内存管理器在管理内存,它分配的长度也不一定是告诉你的长度(比如在分配的内存中中段有个 NULL char,这是很常见的),然后你去释放或者重用外部指针,会带来轻则内存错误,重则被攻击者利用成为可以远程溢出执行代码的漏洞。
    jones2000
        9
    jones2000  
       2020-09-23 23:27:16 +08:00
    为什么不直接用智能指针呢?
    VZXXBACQ
        10
    VZXXBACQ  
       2020-09-24 10:11:53 +08:00
    @jones2000 这是 C 。
    Chenamy2017
        11
    Chenamy2017  
       2020-09-24 10:40:49 +08:00
    可行
    lakehylia
        12
    lakehylia  
       2020-09-24 11:13:50 +08:00
    谁分配的内存,谁管理。假如你有个 api 提供分配的内存指针,最好同时提供一个释放内存指针的 api 。不是所有的内存指针能直接用系统默认的 free 的,鬼知道你的是什么内存管理机制。你这么玩,会被你的组长骂的。。。
    lxilu
        13
    lxilu  
       2020-09-24 11:41:58 +08:00
    要确定能用 free
    jimmyismagic
        14
    jimmyismagic  
       2020-09-24 13:50:42 +08:00
    一般用 char**作为参数,传入 outside 指针引用,然后在里面直接分配内存,这样函数里面也不用引用 outside 的变量了
    yunshansimon
        15
    yunshansimon  
       2020-09-24 15:37:45 +08:00
    可以这么干,但通常没有这么用的。不能把申请和释放放到不同的函数里面。你既然叫 out_side 就要用 char**最为函数参数,传&out_side 进去。另外,要在函数开始检查 out_side 必须是 NULL (也可以不检查,默认 NULL )。否则你会养成坏习惯,每次拿到指针都胡思乱想。你的领导如果在项目中看到这种代码,第一时间就想把你掐死,然后把你老师也掐死。
    ReputationZh
        16
    ReputationZh  
    OP
       2020-09-27 09:58:07 +08:00
    @yunshansimon 我已经把我自己掐死了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2564 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 11:35 PVG 19:35 LAX 04:35 JFK 07:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86