跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 函数外有分配内存的 char *outside,函数内有分配内存的 char *inside,如果先将 outside 所指的内存释放掉,然后将 inside 指针赋值给 outside,可行吗?函数结束后会被释放吗?有没有风险。
未分類
26 9 月 2020

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

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

資深大佬 : ReputationZh 1

示例:

#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("%sn", outside);      free(outside); } 

大佬有話說 (15)

  • 資深大佬 : jmc891205

    可行,函数结束后不会被释放
    风险就是手动管理内存导致的各种 bug

  • 資深大佬 : Yut

    看起来意思只是重复使用 outside 这个 pointer ?一次是本身自己的一次是 inside 的?可以是可以,但是为啥一定要用 outside 那个 pointer 。。。

  • 資深大佬 : zhangmenglong

    会被释放掉吧

  • 資深大佬 : wscanf

    可行啊。 不如直接说你的场景,看看有什么风险

  • 資深大佬 : zmxnv123

    你这都是堆上内存,不分函数内外。

  • 資深大佬 : mybyons

    如果不想自己被其他人打残 还是不要这么干

  • 資深大佬 : rigortek

    可行

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

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

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

    当然也有例外,如果你是 api 提供者,有时生命周期你无法掌控,此时由调用者负责释放。

  • 資深大佬 : ahhui

    这是作死行为,别这样玩,查起 bug 来要人命。你无法确定给你传 outside 指针的外部是什么内存管理器在管理内存,它分配的长度也不一定是告诉你的长度(比如在分配的内存中中段有个 NULL char,这是很常见的),然后你去释放或者重用外部指针,会带来轻则内存错误,重则被攻击者利用成为可以远程溢出执行代码的漏洞。

  • 資深大佬 : jones2000

    为什么不直接用智能指针呢?

  • 資深大佬 : VZXXBACQ

    @jones2000 这是 C 。

  • 資深大佬 : Chenamy2017

    可行

  • 資深大佬 : lakehylia

    谁分配的内存,谁管理。假如你有个 api 提供分配的内存指针,最好同时提供一个释放内存指针的 api 。不是所有的内存指针能直接用系统默认的 free 的,鬼知道你的是什么内存管理机制。你这么玩,会被你的组长骂的。。。

  • 資深大佬 : lxilu

    要确定能用 free

  • 資深大佬 : jimmyismagic

    一般用 char**作为参数,传入 outside 指针引用,然后在里面直接分配内存,这样函数里面也不用引用 outside 的变量了

  • 資深大佬 : yunshansimon

    可以这么干,但通常没有这么用的。不能把申请和释放放到不同的函数里面。你既然叫 out_side 就要用 char**最为函数参数,传&out_side 进去。另外,要在函数开始检查 out_side 必须是 NULL (也可以不检查,默认 NULL )。否则你会养成坏习惯,每次拿到指针都胡思乱想。你的领导如果在项目中看到这种代码,第一时间就想把你掐死,然后把你老师也掐死。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具