什么是动态内存分配
写C++程序时,经常会遇到数组大小不确定的情况。比如你要处理用户上传的照片数量,事先根本不知道有多少张。如果用固定大小的数组,要么浪费空间,要么不够用。这时候就得靠动态分配来解决。
动态分配就是在程序运行时才决定要申请多少内存。它不像局部变量那样存在栈上,而是从堆(heap)里拿空间,灵活性高得多。
new 和 delete 的基本用法
C++里用 new 来分配内存,用 delete 来释放。比如想创建一个 int 类型的空间:
int* p = new int;
*p = 10;
delete p;如果是需要一整块数组,比如要存100个学生的成绩:
int* scores = new int[100];
// 使用完之后
delete[] scores;注意数组要用 delete[],不然可能出问题。
常见使用场景
假设你在做一个小型学生成绩管理系统,启动后才读取文件确认有多少条记录。这时候就可以先读行数,再动态分配对应长度的数组。
int n;
cin >> n;
Student* students = new Student[n];
// 处理数据
// ...
delete[] students;这样既不浪费内存,也不会因为预设太小而溢出。
容易踩的坑
忘了释放内存是最常见的错误。每次 new 都得配对 delete,否则程序跑久了会越来越卡,这就是内存泄漏。
另一个问题是重复释放。同一个指针调两次 delete,程序直接崩溃。保险的做法是删完后把指针设为 nullptr:
delete[] arr;
arr = nullptr;还有就是申请和释放类型不匹配,比如用 new[] 却用普通 delete,行为未定义,后果自负。
现代C++的替代方案
其实现在更推荐用智能指针或者容器类来代替手动管理。比如 std::vector 就能自动处理动态数组:
std::vector<int> vec(100); // 自动分配
// 不用手动 delete底层也是动态分配,但你不用操心释放时机。对于新手来说,少出错,代码也更清晰。
不过理解原始的 new/delete 机制还是有必要的,毕竟这是底层原理,看老项目代码时经常碰到。