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 · 1872 次点击
    这是一个创建于 1303 天前的主题,其中的信息可能已经有所发展或是发生改变。

    示例:

    #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:16 +08:00
    如果不想自己被其他人打残 还是不要这么干
    rigortek
        7
    rigortek  
       2020-09-23 22:15:18 +08:00 via iPhone
    可行

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

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

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

    当然也有例外,如果你是 api 提供者,有时生命周期你无法掌控,此时由调用者负责释放。
    ahhui
        8
    ahhui  
       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   ·   我们的愿景   ·   实用小工具   ·   997 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:40 · PVG 03:40 · LAX 12:40 · JFK 15:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.