【发布时间】:2017-06-07 04:31:37
【问题描述】:
我试图为 malloc 创建返回 NULL 指针的条件。在下面的程序中,虽然我可以看到 malloc 返回 NULL,但一旦程序被强制终止,我看到所有其他程序都变慢了,最后我不得不重新启动系统。所以我的问题是堆内存是否与其他程序共享?如果没有,其他程序应该不会受到影响。操作系统在执行时是否没有分配一定数量的内存?我正在使用 Windows 10,Mingw。
#include <stdio.h>
#include <malloc.h>
void mallocInFunction(void)
{
int *ptr=malloc(500);
if(ptr==NULL)
{
printf("Memory Could not be allocated\n");
}
else
{
printf("Allocated memory successfully\n");
}
}
int main (void)
{
while(1)
{
mallocInFunction();
}
return(0);
}
【问题讨论】:
-
void *mallocInFunction(void) { void *ptr = malloc (500); ... return ptr; }允许您衡量分配的成功或失败。然后while (mallocInFunction()) {}在main。你的内存是共享的(不完全像虚拟内存分配给每个可执行文件),当你开始用完时,你的系统应该关闭非必要的进程。 -
程序在需要时请求增加堆大小并且操作系统提供更多内存......然后其他程序变慢,因为操作系统最终使用磁盘交换空间来提供其他程序,因为您的程序使用了所有真实的记忆。 (很粗略)
-
其他程序可能会在一段时间内变慢,但很快应该在它们的页面被换入时恢复正常操作。如果您的交换量较少,操作系统也可能不得不终止一些进程它稍后将不得不重新开始。如果您的机器在这样的实验之后完全无法使用,您可能想在实验之前尝试增加交换空间(在 Windows 中称为虚拟内存)。通常的交换大小等于物理内存大小。
-
@M.M.在这种情况下,问题可能是交换也被填满了,因为 malloc 仅在交换也已满后才会返回 NULL。
-
@AjayBrahmakshatriya 我认为 Windows 通常不会返回 NULL,它只是延迟分配,然后在交换填满时终止进程
标签: c malloc heap-memory