V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ReputationZh
V2EX  ›  Linux

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

  •  1
     
  •   ReputationZh · Sep 23, 2020 · 2720 views
    This topic created in 2045 days ago, the information mentioned may be changed or developed.

    示例:

    #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 replies    2020-09-27 09:58:07 +08:00
    jmc891205
        1
    jmc891205  
       Sep 23, 2020
    可行,函数结束后不会被释放
    风险就是手动管理内存导致的各种 bug
    Yut
        2
    Yut  
       Sep 23, 2020 via Android
    看起来意思只是重复使用 outside 这个 pointer ?一次是本身自己的一次是 inside 的?可以是可以,但是为啥一定要用 outside 那个 pointer 。。。
    zhangmenglong
        3
    zhangmenglong  
       Sep 23, 2020
    会被释放掉吧
    wscanf
        4
    wscanf  
       Sep 23, 2020
    可行啊。 不如直接说你的场景,看看有什么风险
    xe2vherd
        5
    xe2vherd  
       Sep 23, 2020 via iPhone
    你这都是堆上内存,不分函数内外。
    mybyons
        6
    mybyons  
       Sep 23, 2020
    如果不想自己被其他人打残 还是不要这么干
    rigortek
        7
    rigortek  
       Sep 23, 2020 via iPhone
    可行

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

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

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

    当然也有例外,如果你是 api 提供者,有时生命周期你无法掌控,此时由调用者负责释放。
    0TSH60F7J2rVkg8t
        8
    0TSH60F7J2rVkg8t  
       Sep 23, 2020 via iPhone
    这是作死行为,别这样玩,查起 bug 来要人命。你无法确定给你传 outside 指针的外部是什么内存管理器在管理内存,它分配的长度也不一定是告诉你的长度(比如在分配的内存中中段有个 NULL char,这是很常见的),然后你去释放或者重用外部指针,会带来轻则内存错误,重则被攻击者利用成为可以远程溢出执行代码的漏洞。
    jones2000
        9
    jones2000  
       Sep 23, 2020
    为什么不直接用智能指针呢?
    VZXXBACQ
        10
    VZXXBACQ  
       Sep 24, 2020
    @jones2000 这是 C 。
    Chenamy2017
        11
    Chenamy2017  
       Sep 24, 2020
    可行
    lakehylia
        12
    lakehylia  
       Sep 24, 2020
    谁分配的内存,谁管理。假如你有个 api 提供分配的内存指针,最好同时提供一个释放内存指针的 api 。不是所有的内存指针能直接用系统默认的 free 的,鬼知道你的是什么内存管理机制。你这么玩,会被你的组长骂的。。。
    lxilu
        13
    lxilu  
       Sep 24, 2020
    要确定能用 free
    jimmyismagic
        14
    jimmyismagic  
       Sep 24, 2020
    一般用 char**作为参数,传入 outside 指针引用,然后在里面直接分配内存,这样函数里面也不用引用 outside 的变量了
    yunshansimon
        15
    yunshansimon  
       Sep 24, 2020
    可以这么干,但通常没有这么用的。不能把申请和释放放到不同的函数里面。你既然叫 out_side 就要用 char**最为函数参数,传&out_side 进去。另外,要在函数开始检查 out_side 必须是 NULL (也可以不检查,默认 NULL )。否则你会养成坏习惯,每次拿到指针都胡思乱想。你的领导如果在项目中看到这种代码,第一时间就想把你掐死,然后把你老师也掐死。
    ReputationZh
        16
    ReputationZh  
    OP
       Sep 27, 2020
    @yunshansimon 我已经把我自己掐死了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2712 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 02:59 · PVG 10:59 · LAX 19:59 · JFK 22:59
    ♥ Do have faith in what you're doing.