写程序时碰上 malloc 或 new 返回空指针,心里一紧是常事。明明代码逻辑没问题,结果运行起来直接崩溃,八成是内存没申请到。这种情况在C/C++开发里太常见了,尤其在资源紧张的环境下。
为什么会返回空指针?
调用 malloc、calloc 或 new 申请内存时,系统会尝试从可用内存池中划出一块空间。如果失败,函数就会返回 NULL(或 nullptr)。最常见的几种情况:
- 系统物理内存不足,比如同时跑着几十个大程序
- 进程达到内存使用上限,尤其是32位程序限制在2~4GB之间
- 内存碎片严重,虽然总内存够,但找不到连续的大块空间
- 忘记释放之前申请的内存,导致不断累积泄漏
一个典型的例子
比如你在处理一张超大图片,想动态分配一个数组:
int* pixels = (int*)malloc(8000 * 8000 * sizeof(int));
if (pixels == NULL) {
printf("内存分配失败!\n");
return -1;
}
这段代码在低配电脑上很容易出问题。8000×8000×4字节 ≈ 256MB,看起来不大,但如果程序已经占了不少内存,这一下就卡住了。
怎么避免和应对?
第一原则:每次申请内存后,必须检查是否为空。别图省事跳过判断,这是稳定性的基本保障。
第二,尽量用完就释放。比如用 free(pixels) 及时归还内存,别让程序像个漏桶。
第三,考虑分块处理大数据。与其一口气申请256MB,不如每次处理1000行,循环读取,既省内存又不容易崩。
调试小技巧
在Linux下可以用 top 或 htop 看内存占用;Windows用户任务管理器也能大致观察。如果发现程序内存一路飙升,基本可以断定有泄漏。
另外,工具如 Valgrind 能帮你揪出哪些 malloc 没配对 free,早点发现问题比上线后抓瞎强得多。
有时候问题不在你代码,而是环境本身。比如嵌入式设备、旧服务器,内存本就紧张,写程序得更“抠门”些。宁可多写几行拆解逻辑,也别指望一口吃成胖子。
遇到空指针别急着重装系统或换电脑,先看看是不是自己程序哪里“贪心”了。合理规划内存使用,比啥都管用。