如何获得我的应用程序可以在一次malloc
调用中分配而不返回的最大大小(连续) out of memory
?(最大可用块)
PS:如果我想分配它和不想分配它,我想要一个一般性的答案(所以这个问题不需要重新提出)。
如何获得我的应用程序可以在一次malloc
调用中分配而不返回的最大大小(连续) out of memory
?(最大可用块)
PS:如果我想分配它和不想分配它,我想要一个一般性的答案(所以这个问题不需要重新提出)。
我想你问的是(有点)现代桌面或服务器操作系统。
问题是:返回结果时,任何答案都可能已经无效。原因是其他进程、线程、内存碎片等。正如其他人在评论中所述,操作系统甚至可能报告比可用内存更多的内存——包括交换。这个想法是分配的内存可能仅被进程稀疏使用,因此仅根据需要提供实际访问的内存页面,malloc() 本身不会提前保留任何内存。
分配尽可能多的内存通常也不是一个好主意,因为这可能导致过度交换或饥饿/颠簸其他进程。因此,只需分配您实际需要的内存。
**结论:**忘记它!分配你需要的内存,不多也不少。如果您需要动态内存,请考虑动态结构,如列表和树或使用realloc()
(但要经过深思熟虑)。
边注:
在返回 NULL 之前,不要试图尝试增加分配的块大小。这很容易导致碎片化,您甚至可能无法分配之前最大的块大小(出于与上述类似的原因)。
对于嵌入式操作系统,可能会有完全不同的答案。
下面的代码将提供一个大概的答案,尤其是对于实时操作系统中的实时确定性内存分配器。它不适用于通用操作系统:
#include <stdio.h>
#include <stdlib.h>
#define INCR 100000
int main(void){
unsigned long i;
for(i=1;;i=i+INCR) {
void *ret = malloc(i);
if (ret) {
free(ret);
}
else {
printf("malloc could not allocate memory of size: %ld bytes!\n", i);
return 0;
}
}
}