如何确定提供给free()的地址是否是无效地址?

时间:2011-06-28 10:07:24

标签: c linux free

在调用free( )之前,有没有办法找出提供给free( )的地址是否为无效地址?

我们知道free( )如果地址是无效地址(已经释放的地址),则会创建一个未定义的行为。那么如何确保地址是有效的呢?

提前致谢。

4 个答案:

答案 0 :(得分:6)

如果你需要这样做,你就会遇到一个更大的问题 - 在你完成它之前你已经释放了你的记忆,或者当你完成它之后你没有使记忆的引用无效。而不是试图通过更改free()来阻止程序双重释放,而应该尝试修复指针生命周期问题。

您可能会发现Valgrind可以帮助您找出出错的地方。

答案 1 :(得分:2)

free()对无效地址的行为未定义,因为它是不可预测的。在像C这样的低级语言中,你不能说地址是“有效”还是“无效”。地址可能有多种方式无效。 “已经释放”只是其中一种情况包括:地址未由malloc分配,数据实际上不是地址(例如某些整数或字符串转换为指针),数据损坏等。

如果您对“已经释放”的情况感兴趣,那么您可以尝试跟踪每个内存分配和释放(例如,通过使用自定义malloc()free()包装)但这可能只会使你的代码更复杂,甚至更容易出错。

简单回答:不,没有办法检查地址是否无效。如果您根本不关心内存地址,请使用它或切换到更高级别的语言(例如Python)。

答案 2 :(得分:2)

为了更有帮助,我们确实需要了解您的预期用例。

如果您正在使用相同的指针来有时引用malloc获取的内存,并且在其他时候引用字符串文字或自动变量,那么您应该只是在指针旁边存储一个标志,指示是否指向malloc获得的内容。或者,当数据不需要释放时,您可以简单地存储名为ptr_to_free的指针的第二个副本NULL。这也有一个好处,就是你的“主指针”可以“移动”并指向对象的不同部分,因为你要保持原始/基本指针单独释放。

如果只是为了避免双重免费问题,您只需要修复代码,这样就不会发生。在释放它指向的内容之后将指针设置为NULL是一个邋trick的技巧,通常会让你大部分都在那里,但你可能有更大的设计问题需要重新考虑......

答案 3 :(得分:0)

正如其他人所建议的那样,跟踪指针是了解内存是否已被释放的好方法。

我还建议以下指示。

  1. 在声明
  2. 时将指针初始化为NULL
  3. 一旦释放,您再次将其初始化为NULL
  4. 在尝试释放之前检查指针是否为NULL。