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

在调用free( )之前,有什么方法可以查明提供给free( )的地址是否是无效地址?

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

提前致谢。

如果你需要这样做,你会遇到一个更大的问题 – 在完成之前,你已经释放了你的记忆,或者当你完成它的时候,你还没有使对内存的引用失效。 而不是试图通过改变free()来停止你的程序的双重释放,你应该试图解决你的指针生存期问题。

您可能会发现Valgrind可以帮助您找出问题所在。

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

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

简单的回答:不,没有办法检查地址是否无效。 住在一起,或者切换到更高级别的语言(如Python),当你不关心内存地址。

没有

为了更有帮助,我们真的需要知道您的预期使用情况。

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

如果仅仅是为了避免双重问题,你只需要修复你的代码,这样就不会发生。 在你释放它指向的东西之后,将指针设置为NULL是一个琐碎的技巧,通常会让你感受到大部分的方式,但是你可能有更大的设计问题来重新思考。

正如其他人所建议的,跟踪指针是知道内存是否被释放的好方法。

我也建议以下几点。

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