内存泄露详解
内存泄露的含义
内存泄漏(Memory Leak)是指程序在运行过程中,动态分配的内存(比如用 new/malloc 分配的内存)不再被使用,但没有被释放,导致这部分内存一直被占用,直到程序结束才会被操作系统回收。
在短时间运行的小程序中,内存泄露可能看不出影响,但长期运行的程序(比如服务器、后台服务)会持续占用更多内存,最终导致程序卡顿、崩溃,甚至耗尽系统内存。
内存泄漏的常见原因
内存泄漏的本质是:动态分配的内存的'所有权'丢失——程序再也找不到这块内存的指针,无法调用 delete/free 释放它。常见场景有:
1. 只分配不释放
这是新手最容易犯的错误,用 new 分配内存后,没有对应的 delete。
#include <iostream>
using namespace std;
void func() {
// 动态分配 int 类型内存,指针 p 是局部变量
int* p = new int(10);
// 用完后没有 delete,函数结束后 p 被销毁,再也找不到这块内存
}
int main() {
// 多次调用 func,会泄漏多块内存
for (int i = 0; i < 1000; i++) {
func();
}
return 0;
}
每次调用 func,都会分配 4 字节(int 大小)内存,但没有释放。循环 1000 次后,就泄漏了 4000 字节内存,且程序运行期间无法回收。
2. 指针被覆盖(所有权丢失)
指针指向动态内存后,被重新赋值,原内存地址丢失,无法释放。
void func() {
int* p = new int(20);
p = ();
p;
}

