堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++中主要利用new在堆区开辟内存
堆区的比喻
想象一下,你在玩一个叫做“宝藏猎人”的游戏。在这个游戏中,你有一个大宝箱(这个宝箱就像是堆区),你可以在任何时候往里面存放宝藏(这些宝藏就像是我们的数据)。
-
程序员分配释放:这就像是在游戏中,你可以决定什么时候往宝箱里放宝藏,也可以决定什么时候把宝藏从宝箱里拿出来。
-
new 在堆区开辟内存:当你在游戏中找到一个宝藏并决定把它放进宝箱时,你就相当于是在堆区使用 new 来开辟了一块内存。比如,你想放一个金币到宝箱里,你可以说:“用 new 给我一个金币的空间。”
-
程序员不释放,程序结束时由操作系统回收:这就像是如果你在游戏结束时忘记把宝藏从宝箱里拿出来,那么游戏结束后,会有人来清理宝箱,把宝藏收走。在编程中,如果你忘记告诉电脑去释放堆区的内存,那么当程序结束时,操作系统会帮你清理。
为什么这样做
这是因为,就像宝藏猎人游戏中的宝箱,堆区给你提供了一个地方来存放你的宝藏(数据),但你需要自己管理这些宝藏。如果你不再需要某个宝藏了,你应该把它从宝箱里拿出来(释放内存)。如果你不这么做,宝箱可能会变得很满,到最后就没有空间放新的宝藏了(这在编程中叫做内存泄漏)。
代码例子
在编程中,这看起来可能是这样的:
int* createNumber() {
int* number = new int; // 使用 new 在堆区分配内存
*number = 10; // 给这块内存赋值
return number; // 返回这块内存的地址
}
int main() {
int* myNumber = createNumber(); // 创建一个数字并获取它的地址
// 使用 myNumber...
cout << *myNumber << endl; // 打印这个数字
delete myNumber; // 告诉电脑我们不再需要这块内存了
// 系统会在程序结束时自动清理,但最好还是手动释放内存
return 0;
}
在这个例子中,我们使用 new 在堆区分配了一块内存来存放一个整数,并使用 delete 来释放这块内存。这是一个好习惯,因为它可以防止内存泄漏。