2

如何获得我的应用程序可以在一次malloc调用中分配而不返回的最大大小(连续) out of memory?(最大可用块)

PS:如果我想分配它和不想分配它,我想要一个一般性的答案(所以这个问题不需要重新提出)。

4

2 回答 2

4

我想你问的是(有点)现代桌面或服务器操作系统。

问题是:返回结果时,任何答案都可能已经无效。原因是其他进程、线程、内存碎片等。正如其他人在评论中所述,操作系统甚至可能报告比可用内存更多的内存——包括交换。这个想法是分配的内存可能仅被进程稀疏使用,因此仅根据需要提供实际访问的内存页面,malloc() 本身不会提前保留任何内存。

分配尽可能多的内存通常也不是一个好主意,因为这可能导致过度交换或饥饿/颠簸其他进程。因此,只需分配您实际需要的内存。

**结论:**忘记它!分配你需要的内存,不多也不少。如果您需要动态内存,请考虑动态结构,如列表和树或使用realloc()(但要经过深思熟虑)。

边注:

在返回 NULL 之前,不要试图尝试增加分配的块大小。这很容易导致碎片化,您甚至可能无法分配之前最大的块大小(出于与上述类似的原因)。


对于嵌入式操作系统,可能会有完全不同的答案。

于 2015-06-14T22:20:28.567 回答
-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;
        }
    }
}
于 2015-06-14T22:11:04.057 回答