在调用free( )
之前,有没有办法找出提供给free( )
的地址是否为无效地址?
我们知道free( )
如果地址是无效地址(已经释放的地址),则会创建一个未定义的行为。那么如何确保地址是有效的呢?
提前致谢。
答案 0 :(得分:6)
如果你需要这样做,你就会遇到一个更大的问题 - 在你完成它之前你已经释放了你的记忆,或者当你完成它之后你没有使记忆的引用无效。而不是试图通过更改free()
来阻止程序双重释放,而应该尝试修复指针生命周期问题。
您可能会发现Valgrind可以帮助您找出出错的地方。
答案 1 :(得分:2)
free()
对无效地址的行为未定义,因为它是不可预测的。在像C这样的低级语言中,你不能说地址是“有效”还是“无效”。地址可能有多种方式无效。 “已经释放”只是其中一种情况包括:地址未由malloc分配,数据实际上不是地址(例如某些整数或字符串转换为指针),数据损坏等。
如果您对“已经释放”的情况感兴趣,那么您可以尝试跟踪每个内存分配和释放(例如,通过使用自定义malloc()
和free()
包装)但这可能只会使你的代码更复杂,甚至更容易出错。
简单回答:不,没有办法检查地址是否无效。如果您根本不关心内存地址,请使用它或切换到更高级别的语言(例如Python)。
答案 2 :(得分:2)
否强>
为了更有帮助,我们确实需要了解您的预期用例。
如果您正在使用相同的指针来有时引用malloc
获取的内存,并且在其他时候引用字符串文字或自动变量,那么您应该只是在指针旁边存储一个标志,指示是否指向malloc
获得的内容。或者,当数据不需要释放时,您可以简单地存储名为ptr_to_free
的指针的第二个副本NULL
。这也有一个好处,就是你的“主指针”可以“移动”并指向对象的不同部分,因为你要保持原始/基本指针单独释放。
如果只是为了避免双重免费问题,您只需要修复代码,这样就不会发生。在释放它指向的内容之后将指针设置为NULL是一个邋trick的技巧,通常会让你大部分都在那里,但你可能有更大的设计问题需要重新考虑......
答案 3 :(得分:0)
正如其他人所建议的那样,跟踪指针是了解内存是否已被释放的好方法。
我还建议以下指示。