如何处理C语言中的free()错误?

6
假设我使用了一个 free() 函数释放了一块内存,但由于某些原因我不被允许这样做。我应该如何防止 C 应用程序崩溃并生成错误信息以继续执行?我没有 try-catch 这种处理机制(类似于 C++/Java...)。有没有办法忽略这个错误并继续执行?
如果可以的话,
  1. 你该如何做到这一点?
  2. 更重要的是,考虑到出现内存错误,这样继续执行是否可取?
谢谢。

行为取决于平台和库的实现。如果您想得到任何有意义的答案,您需要更具体些。 - Rob Kennedy
你确定传递给 free() 的指针指向一个有效的内存块吗?如果调用 free() 导致崩溃,那么你可能有更大的问题。 - In silico
据我所知,如果向free()传递有效指针,则不会终止程序。 - Mihran Hovsepyan
假设我们看到了展示你问题的代码。 - Michael Foukarakis
@Mihran,如果你将free传递给未被malloc(或callocrealloc等)返回的内容,则行为是未定义的。未定义的行为可能包括终止程序。有很多有效的指针malloc没有返回,也有很多无效的指针malloc确实返回了。指针的有效性是无关紧要的。 - Rob Kennedy
@Rob 同意。在这种情况下,"valid" 这个词不太合适。 - Mihran Hovsepyan
3个回答

10

这肯定不是个好主意。即使你程序中free函数的版本正确地检测到你要释放的内存不能被释放,因此不会造成任何伤害,但你的程序仍存在缺陷——某个部分程序认为它拥有该内存。谁知道在释放之前,它可能已经尝试使用了那块内存做过什么?找到并修复这个缺陷,不要掩盖它。


8

在C标准中没有任何可以用来实现你想要的功能。关于free函数的描述非常清楚(C99中的§7.20.3.2):

free函数将指向ptr的空间释放,即可用于进一步分配。如果ptr是一个空指针,则不执行任何操作。否则,如果参数与之前由calloc、malloc或realloc函数返回的指针不匹配,或者该空间已经被free或realloc调用释放,则行为未定义。


0

释放无效内存是一个严重的错误,应该修复,因为这可能会破坏程序的状态。尝试使用像valgrind这样的工具来发现问题所在。

你应该只对从malloccallocreallocNULL指针接收到的指针使用free。此外,你不应该对同一指针多次使用free


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接