忽略多线程问题,以下保证可以正常工作:
int can_alloc(size_t i)
{
void *p = malloc(i);
if(p == NULL) return 0;
free(p);
return 1;
}
// later
if(can_alloc(10))
{
char *c = malloc(10); // no need to verify, we already did?
memcpy(c, "something", 10);
}
这主要是出于好奇。我没有计划将它用于任何事情,但我相信它应该保证能够正常工作,并且确实可以提供信息。
答案 0 :(得分:5)
没有。即使没有多线程,malloc
调用也是从OS获取(内存)资源。通常(Windows,Linux,Mac等)操作系统可以在程序执行期间随时执行影响可用资源的操作。这意味着在您的支票和实际分配之间,内存可能会变得“无法使用”。
如果您对操作系统有异常完整的控制权,那么可能会使其变得强大 - 但这将非常棘手。
答案 1 :(得分:1)
上面的答案是正确的。在许多Linux版本上,它更糟糕,因为它使用乐观的内存分配。因此即使malloc()
返回非null,它不意味着内存确实可用。更多信息here。