gpt4 book ai didi

c - 在 C 中重用释放的指针

转载 作者:太空狗 更新时间:2023-10-29 16:38:31 24 4
gpt4 key购买 nike

这个网站上有很多关于使用后释放指针以及将它们设置为 NULL 的问题。争论很激烈,话题似乎平分秋色。例如:This question .我对一般的释放指针感到困惑。

假设您有一个指向某个内存空间的指针。使用该空间后,释放指针但不将其设置为 NULL。稍后,您有另一个调用 malloc() 或一些类似的指针,它被分配内存,包括之前释放的内存(原始指针仍然指向)。如果这个新指针写入这个内存块,会发生什么?直觉上什么都不会发生,但是前面提供的链接中的 OP 写道它会使程序崩溃。


所以我的问题是:

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

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

最佳答案

Given a freed pointer, what is keeping you from reassiging that pointer to a new memory location?

从技术上讲,没有。您甚至不需要在释放和重新分配指针之间设置 ptr = NULL。但是,当释放和重新分配被其他代码行分隔时,将指针设置为 NULL 可能会略微提高可读性。

Why would writing to a memory block that was previously freed, that still has the original pointer to it, cause the program to crash?

只要您的程序不尝试解引用该指针,只需持有一个指向可通过另一个指针访问的内存块的指针就可以了。不幸的是,即使取消引用已释放的指针,也不一定会导致程序崩溃:通常情况下,这种行为不会引起注意。但是,它仍然是未定义的行为。您程序的另一部分可能写入了与您期望的不兼容的数据,在这种情况下,您会发现极难发现或解释的错误。

关于c - 在 C 中重用释放的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17863923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com