You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在无限循环中调用malloc()致系统崩溃,为何malloc未返回NULL?

为什么malloc()在内存耗尽时没有返回NULL反而导致系统蓝屏?

你的问题核心在于Windows的虚拟内存惰性分配机制以及系统内存耗尽时的处理逻辑,结合MSVC的malloc实现共同导致了这个结果:

  1. 虚拟内存的惰性分配
    Windows下,malloc底层依赖的内存分配API(如HeapAlloc或VirtualAlloc)采用惰性分配策略:调用分配函数时,系统只是为进程预留一段虚拟地址空间,并不会立刻分配对应的物理内存或页面文件空间。只有当你实际向分配的内存地址写入数据时,系统才会触发物理页的分配。
    你的代码中只调用malloc却没有对分配的内存进行写入操作,因此系统会不断允许虚拟地址空间的分配,直到进程的虚拟地址空间接近耗尽,或者系统的页面文件被完全占用。

  2. 系统内存耗尽时的优先级处理
    当页面文件被耗尽后,系统进入极度内存紧张状态。Windows会优先保障关键系统进程(如csrss.exe、smss.exe)的内存需求,因为这些进程是系统运行的核心。如果此时系统无法为关键进程分配必要的内存,就会触发CRITICAL PROCESS DIED蓝屏,而不是让你的用户态进程获得malloc返回的NULL——因为系统已经没有足够资源来完成正常的内存分配失败处理流程。

  3. MSVC malloc的实现特性
    MSVC的malloc实现不会在物理内存/页面文件不足时立刻返回NULL,它只会在进程的虚拟地址空间真的无法再分配时才返回NULL。而在你的场景中,系统在虚拟地址空间耗尽前就已经因为页面文件耗尽、关键进程无法获取内存而崩溃了。

验证方法

如果修改代码,在malloc后立刻写入内存,让系统强制分配物理页:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main() {
    while (1) {
        int64_t* ptr = malloc(sizeof(int64_t));
        if (ptr == NULL) {
            printf("Out of memory\n");
            break;
        }
        *ptr = 0; // 强制触发物理页分配
    }
    return 0;
}

这种情况下,系统会更早地遇到物理内存/页面文件不足的情况,可能会先尝试终止你的进程(而非蓝屏),极端情况下仍可能蓝屏,但你更有可能看到malloc返回NULL的场景(取决于系统配置和当前运行的进程)。

内容的提问来源于stack exchange,提问作者Zombies are Real

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:30:56