【发布时间】:2012-03-09 00:55:53
【问题描述】:
我正在尝试使用 malloc 进行实验,看看是否可以分配所有可用内存。
我使用了以下简单的程序并有几个问题:
int main(void)
{
char * ptr;
int x = 100;
while(1)
{
ptr = (char *) malloc(x++ * sizeof(char) / 2);
printf("%p\n",ptr);
}
return 0;
}
1) 为什么当使用更大的数据类型(int、unsigned long long int、long double)时,进程会使用更少的内存,而使用更小的数据类型(int、char)会使用更多的内存?
2) 运行程序时,它会在达到一定数量后停止分配内存(在 Windows 7 64 位上约为 592mb,8GB RAM 交换文件设置为系统管理)。打印的输出如果显示为 0,则表示 NULL。为什么在达到这个阈值后停止分配内存而不耗尽系统内存和交换?
我在下面的帖子中发现有人尝试与我相同的事情,但他们没有看到内存使用有任何差异,但我是。 Memory Leak Using malloc fails
我已经在 Linux 内核 2.6.32-5-686 上尝试了代码,结果相似。
任何帮助和解释将不胜感激。
谢谢,
【问题讨论】:
-
使用
long long应该会占用更多内存。你试过什么?您要输出的只是内存中存储它的位置,而不是分配的内存。在您的示例中,您分配了 50 个字节。 -
只是想在别人之前说这句话,不要强制转换malloc的返回值。呜呜呜!!
-
本地堆和系统堆是有区别的。在 Windows 中,应用程序不会获得非常大的本地堆,因此 malloc 会更快地耗尽内存。使用 VirtualAlloc() 从系统堆中分配。那么问题可能会变成小分配而不是实际内存的句柄/页面不足。
-
ricola: 为什么不呢?!建议怎么做?
-
改用
calloc。或者写入最后分配的字节。
标签: c memory memory-leaks memory-management malloc