你能知道 free() 在 C 中是否成功而不崩溃吗?
Can you know whether free() was successful in C without crashing?
malloc()
return如果分配不成功,则为空指针。 free()
不幸的是 return 释放是否成功,因为它的签名是:
void free(void* ptr)
是否可以:
尝试 free()
并在调试器没有为您崩溃应用程序的情况下了解释放是否成功?
事先了解在指针上调用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:
...
- Get beforehand whether calling
free()
on a pointer will result in a failure or success?
是的!如果你的程序是正确的,free()
只能成功。如果 free()
可能会失败,那么根据定义,您的程序是不正确的。
我知道这不是你的意思,但是让你的程序静态正确是正确的前进方向。
要查找内存处理中的错误,您可以使用错误检查 malloc/free
(例如 glibc 在 运行 MALLOC_CHECK_=1
时为您提供 - 其他平台可能有自己的设置机制),或者使用类似 valgrind
或地址消毒器
请注意,这些 是 逻辑错误,您应该修复这些错误...然后您的程序将再次静态正确。
malloc()
return如果分配不成功,则为空指针。 free()
不幸的是 return 释放是否成功,因为它的签名是:
void free(void* ptr)
是否可以:
尝试
free()
并在调试器没有为您崩溃应用程序的情况下了解释放是否成功?事先了解在指针上调用
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: ...
- Get beforehand whether calling
free()
on a pointer will result in a failure or success?
是的!如果你的程序是正确的,free()
只能成功。如果 free()
可能会失败,那么根据定义,您的程序是不正确的。
我知道这不是你的意思,但是让你的程序静态正确是正确的前进方向。
要查找内存处理中的错误,您可以使用错误检查 malloc/free
(例如 glibc 在 运行 MALLOC_CHECK_=1
时为您提供 - 其他平台可能有自己的设置机制),或者使用类似 valgrind
或地址消毒器
请注意,这些 是 逻辑错误,您应该修复这些错误...然后您的程序将再次静态正确。