内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这4部分构成的。当然,在内存中,加载Windows等操作系统的内存空间又是另外一回事了
1. 变量的内存空间:
这是用来存储程序中的各种变量和数据的内存区域。这包括全局变量和局部变量,它们在程序执行过程中被创建、访问和修改。
这些数据可以是数字、文本、图像等等。程序可以随时访问这些数据,需要在程序中使用某些值时,它们会被加载到变量的内存空间中。
2. 函数的内存空间
这是用来存储程序中的函数代码的内存区域。函数的内存空间包括函数的指令集和与函数调用有关的上下文信息。当函数被调用时,它的代码和相关数据被加载到内存中以执行。
是存储程序中的功能和操作指令的地方。函数是程序的组成部分,用于执行各种任务。当程序需要执行特定功能时,它会加载函数的内存空间,然后按照函数中的指令来执行相应的任务。
3. 栈内存:
栈是一种用于存储函数调用和局部变量的内存结构。每当函数被调用,一个新的栈帧会被推送到栈上,包含函数的参数、局部变量和返回地址。当函数执行完成,栈帧被弹出,程序控制返回到调用函数。
通俗来说,每当程序调用一个函数时,会创建一个新的"栈帧",用来存储函数的参数和局部数据。当函数执行完成后,栈帧被销毁。这样,程序可以管理多个函数的调用和数据。
4. 堆内存
堆是用来存储动态分配的内存块的区域。通常,堆内存用于存储程序中需要在运行时动态创建和释放的数据结构,如对象和数组。开发人员可以显式地分配和释放堆内存。
通俗来说,堆是一种用来存储程序中需要在运行时分配的数据的地方。例如,如果程序需要创建一个新对象或数组,它会在堆内存中分配空间,然后在不需要时释放该空间。这使得程序可以在运行时动态地管理内存
加载Windows等操作系统的内存空间,这是操作系统内存管理的一部分。操作系统负责分配和管理内存以便运行各种程序,包括应用程序和服务。操作系统内存通常包括内核空间(用于操作系统内核代码和数据)和用户空间(用于应用程序代码和数据)等不同的区域。
当程序运行时,操作系统会负责将这些不同的内存部分协调在一起,以便程序能够正常运行。操作系统也会分配一部分内存用于自身的运行,以及用于管理其他程序的内存需求。这就是计算机内存的基本工作原理
栈与堆
在内存的使用方法上,栈与堆二者存在些许不同。
栈中对数据进行存储和舍弃(清理处理)的代码,是由编译器自动生成的,因此不需要程序员的参与。使用栈的数据的内存空间,每当函数被调用时都会得到申请分配,并在函数处理完毕后自动释放。
堆的内存空间,则要根据程序员编写的程序,来明确进行申请分配或释放。
根据编程语言的不同,对堆用的内存空间进行申请分配和释放的程序的编写方法也是多种多样的。C语言中是通过malloc()函数来进行申请分配、通过free()函数来释放的。
而C++中则是通过new运算符来申请分配、通过delete运算符来释放的。无论是C语言还是C++,如果没有在程序中明确释放堆的内存空间,那么即使在处理完毕后,该内存空间仍会一直残留。这个现象称为内存泄露(memory leak)
内存泄漏
无论使用哪种语言,如果程序没有在适当的时候释放已分配的堆内存,那么即使程序执行完毕,这些内存空间仍然会存在,没有被系统回收。这个现象被称为"内存泄漏"(memory leak)。
内存泄漏可能会导致程序运行时占用的内存不断增加,最终可能导致程序性能下降或崩溃