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