如何在不返回malloc
的情况下,在一次out of memory
调用中获取应用程序可以分配的最大大小(连续)字节数? (最大可用块)
P.S。:如果我想分配它,如果我不想分配它,那么我想要两者的一般答案(所以这个问题不需要重新考虑)。
答案 0 :(得分:4)
我认为你在询问(某种程度上)现代桌面或服务器操作系统。
问题是:返回结果时,任何答案都可能无效。原因是其他进程,线程,内存碎片等。 正如其他人已在评论中所述,操作系统甚至可能会报告比可用内存更多的内存 - 包括交换。这个想法是分配的内存可能只被进程稀疏地使用,因此只有实际访问内存页面才会被提供,malloc()本身不会提前预留任何内存。
分配尽可能多的内存通常也不是一个好主意,因为这可能导致过度交换或挨饿/摧毁其他进程。所以,只需分配你真正需要的内存。
**结论:**忘了吧!分配您需要的内存,而不是更多,而不是更少。如果你需要动态内存,可以考虑列表和树等动态结构,或者使用realloc()
(但要仔细考虑)。
<强>旁注:强>
在返回NULL之前,不要试图尝试增加大小的已分配块。这很容易导致碎片化,您甚至可能无法分配以前最大的块大小(出于上述类似的原因)。
对于嵌入式操作系统,可能会有完全不同的答案。
答案 1 :(得分:-3)
下面的代码将提供一个近似的答案,特别是对于实时操作系统中的实时确定性内存分配器。它不是通用操作系统的目标:
#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;
}
}
}