【问题标题】:can we use a pointer freed earlier?我们可以使用之前释放的指针吗?
【发布时间】:2011-01-17 00:31:22
【问题描述】:

我有一个关于 C 中的 free() 的问题。

假设我有一个指向某个结构的指针(比如节点 *ptr).. 在释放它之后我可以将它初始化为 NULL 并使用 malloc() 或 realloc() 使其指向某个新位置吗?

例如:

node *ptr=NULL;
ptr=realloc(ptr,sizeof(node)); //works exactly like malloc

/* Do some operations on ptr */

free(ptr);

ptr=NULL;
ptr=realloc(ptr,sizeof(node));

这是有效的,还是会产生问题。 我使用 realloc 代替 malloc 的原因是因为我所有的 realloc() 调用都在一个循环中(所以在第二个参数中它实际上是 n*sizeof(node) 而不是 sizeof(node) ,其中 n 不断增加......并且这个结果数组中的最后一个位置是用新数据写入的)ptr指向的内存不断增加直到循环结束,此时我不需要ptr指向的内存中的数据,所以我认为它最好释放它。现在,所有这些都嵌套在一个更大的(外)循环中。

非常感谢您的帮助

【问题讨论】:

  • 为什么不根据您计划使用的代码发布您的问题?看起来你已经把你的代码过度简化到了这样的程度,它的合法性确实没有问题。

标签: c memory memory-management free


【解决方案1】:

您不应该将其视为“释放指针”,而是释放指针指向的任何东西。指针首先指向一个对象(然后可能会被释放),然后再指向另一个对象,这是完全正常的。

【讨论】:

  • 但是在重用它之前是否有必要分配 ptr=NULL ?我尝试在 realloc() 调用中重用它而不将其分配为 NULL,它给了我一个分段错误..
  • 是的...有一个实例在将其分配为 NULL 并调用 realloc() 后,如 ptr=(char**)realloc(ptr,(n+1)*sizeof(char* ));其中 n=0...它给了我一个分段错误...这可能是什么原因?
  • 原因是您将一个指向已释放内存的指针传递给了 realloc。正如您在代码中所说,当参数为空时,realloc 的行为类似于 malloc。这不成立。 realloc 通常用于更改内存分配的大小。所以它期望它的参数是一个指向一块分配的内存(或空)的指针。如果参数是其他任何东西,则行为未定义,这通常意味着段错误。
【解决方案2】:

没关系 - 你不是真正重用了指针,而只是重用了持有指针的变量。

【讨论】:

  • 但是在重用它之前是否有必要分配 ptr=NULL ?我尝试在 realloc() 调用中重用它而不将其分配为 NULL,它给了我一个分段错误..
  • 是的...有一个实例,在将其分配为 NULL 并调用 realloc() 后,如 ptr=(char**)realloc(ptr,(n+1)*sizeof(char* ));其中 n=0... 它给了我一个分段错误... 这可能是什么原因?
  • 在这种情况下是的 - 你不能依赖一个“旧”指针值妨碍。
  • 您不想在已释放的指针上使用realloc()realloc() 旨在更改先前分配的内存块的大小。
  • @assassin:你应该使用realloc 来达到它的目的:将内存重新分配给一个已经分配的块。
【解决方案3】:

ptr 不记得它曾经被赋值过,如果它被赋值为 NULL,那么再次使用它与第一次使用它没有什么不同。

由于realloc() 在传递 NULL 指针时的行为类似于 malloc(),所以它应该可以正常工作。

【讨论】:

  • 但是在重用它之前是否有必要分配 ptr=NULL ?我尝试在 realloc() 调用中重用它而不将其分配为 NULL,它给了我一个分段错误..
  • 是的...有一个实例在将其分配为 NULL 并调用 realloc() 后,如 ptr=(char**)realloc(ptr,(n+1)*sizeof(char* ));其中 n=0...它给了我一个分段错误...这可能是什么原因?
  • @assassin:当你在重用它之前没有分配NULL,那么你传入了一个无效的指针,这绝对是一个错误。最好的办法是在调用 free() 时而不是在 realloc() 之前分配 NULL(否则您可能将 NULL 分配给完全有效的指针并以这种方式泄漏内存)。
猜你喜欢
  • 2023-03-24
  • 2017-01-09
  • 1970-01-01
  • 2011-06-12
  • 2019-09-08
  • 1970-01-01
  • 2011-04-05
  • 2011-02-15
  • 2013-11-30
相关资源
最近更新 更多