我是C的新手
我想知道应用程序允许的最大内存。 所以我写了一个类似下面的小程序。
我的机器总内存为16GB,使用了2GB,14GB是免费的。 我预计这个程序会停止在14GB左右,但它会永远运行。
我想在这里做错吗?
#include <stdlib.h>
#include <stdio.h>
int main(){
long total = 0;
void* v = malloc(1024768);
while(1) {
total += 1024768;
printf ( "Total Memory allocated : %5.1f GB\n", (float)total/(1024*1024768) );
v = realloc(v, total);
if (v == NULL) break;
}
}
编辑:在CentOS 5.4 64位上运行该程序。
答案 0 :(得分:5)
在大多数现代操作系统中,为每个使用的页面分配内存,而不是为每个“保留”的页面分配内存。您的代码不使用任何页面,因此实际上没有分配内存。
尝试使用memset
清除您分配的内存;最终程序会崩溃,因为它无法再分配页面。
我试图找到一个引用,但我没有成功。感谢您的帮助!
答案 1 :(得分:4)
我想在这里做错吗?
嗯,你说你运行应用程序的机器有16GB的RAM,所以我假设它是64位的。这意味着您的应用程序将在耗尽1 /物理内存和2 /虚拟内存之前运行很长时间。
在32位Windows上,您的应用程序将停止在4GB。在64位Windows上,您的应用程序将停止在16TB(假设您有一个可以自动增长的页面文件,以及那么多硬盘空间)。
http://support.microsoft.com/kb/294418
YMMV与其他操作系统。
编辑:ruslik指出在实践中,您的进程无法在32位上分配最大2GB或3GB的内存(取决于编译二进制文件的方式)视窗。从上面链接的知识库文章中,您的进程占用的最大内存为3GB或4GB,1GB属于您无法使用的操作系统。
答案 2 :(得分:1)
如果您使用的是某个特定平台/操作系统,则应使用报告功能,这是该操作系统的特定功能。
如果你是eritiong跨平台程序,你不应该依赖任何免费的内存检查算法。原因是: