你能知道 free() 在 C 中是否成功而不崩溃吗?

Can you know whether free() was successful in C without crashing?

malloc() return如果分配不成功,则为空指针。 free() 不幸的是 return 释放是否成功,因为它的签名是:

void free(void* ptr)

是否可以:

  1. 尝试 free() 并在调试器没有为您崩溃应用程序的情况下了解释放是否成功?

  2. 事先了解在指针上调用free()是失败还是成功?

此 C-API 函数的 MSVC 版本设置 errno

https://msdn.microsoft.com/en-us/library/we1whae7%28v=vs.100%29.aspx

就 C 标准而言:

如果您从 malloc() 返回的指针等于您传递给 free() 的指针,那么 free() 将始终成功。唯一可用的错误检查是将指针与原始地址的副本进行比较,然后再将其传递给 free()。示例:

type_t* foo = malloc(sizeof(*foo));
type_t* const original = foo;
...

if(foo == original)
{
  free(foo);
}
else
{
  halt_and_catch_fire();
}

如果您需要比这更高级的错误处理,则必须使用 OS 特定的 API 函数。

Is it possible to: ...

  1. Get beforehand whether calling free() on a pointer will result in a failure or success?

是的!如果你的程序是正确的,free()只能成功。如果 free() 可能会失败,那么根据定义,您的程序是不正确的。

我知道这不是你的意思,但是让你的程序静态正确是正确的前进方向。


要查找内存处理中的错误,您可以使用错误检查 malloc/free(例如 glibc 在 运行 MALLOC_CHECK_=1 时为您提供 - 其他平台可能有自己的设置机制),或者使用类似 valgrind 或地址消毒器

请注意,这些 逻辑错误,您应该修复这些错误...然后您的程序将再次静态正确。