Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
ReputationZh
V2EX  ›  Linux

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

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

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

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

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

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