在C中重用释放的指针

she*_*lbc 14 c free pointers

本网站上有很多关于在使用后释放指针的问题,并且进一步将它们设置为NULL.争论很激烈,主题看似平分.例如:这个问题.一般来说,我对释放指针很困惑.

想象一下,你有一个指向一些内存空间的指针.使用空格后,释放指针但不要将其设置为NULL.稍后,你有另一个指针调用malloc(),或者一些模拟,并且它被分配了内存,包括先前释放的内存(原始指针仍然指向).如果这个新指针写入此内存块,会发生什么?直觉上什么都不会发生,但前面提供的链接中的OP写道它会使程序崩溃.


所以我的问题是:

  1. 给定一个释放指针,是什么阻止您将指针重新分配给新的内存位置?为什么重用已释放的指针是"坏"的做法?如果调用free(ptr)只将此内存返回给操作系统,为什么不能将指针重新分配给其他内存位置并重新使用?

    char *ptr = malloc(sizeof(*ptr)); //first allocation
    free(ptr); //release memory 
    ptr = NULL; 
    ptr = malloc(sizeof(*ptr)); //reallocate
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为什么要写入以前释放的内存块,仍然有原始指针,导致程序崩溃? - 请参阅上面链接的问题的第一篇文章的第一段(如果我误解了本段的意图,请解释,因为不明确是否再次使用该指针来写入内存或创建新指针.)

das*_*ght 11

给定一个释放指针,是什么阻止您将指针重新分配给新的内存位置?

从技术上讲,没什么.您甚至不需要ptr = NULL在释放和重新分配指针之间进行设置.但是,当释放和重新分配由其他代码行分开时,将指针设置为NULL可以略微提高可读性.

为什么要写入以前释放的内存块,仍然有原始指针,导致程序崩溃?

只要您的程序不尝试取消引用该指针,只需保持指向可通过另一个指针访问的内存块的指针即可.不幸的是,即使您取消引用释放的指针,它也不一定会导致程序崩溃:通常情况下,这种行为会被忽视.但它仍然是一种未定义的行为.程序的另一部分可能有与您期望的不兼容的书面数据,在这种情况下,您将看到极难找到或解释的错误.