栈,堆,静态区

笔记内容浅薄,小白个人在网上看大佬博客总结,若有不妥之处请联系,请大佬指教,愿意学习。

对于栈,堆,静态区的学习和理解

栈区:在调用函数时,函数中的局部变量的存储单元是在栈上创建的,ha

函数执行结束后,这些存储单元被自动释放。

堆区:堆是动态分布内存,由程序员管理,若程序员不释放,结束后可能被os回收。

静态区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

下面是引自[Think in C++]的一段原文

The stack is an area in memory that is used directly by the microprocessor to store data during program execution.Variables on the stack are sometimes called automatic or scoped variables
  The second approach is to create objects dynamically in a pool of memory called the heap.In this approach you don
’t know until runtime how many objects you need, what their lifetime is, or what their exact type is. Those decisions are made at the spur of the moment while the program is running. If you need a new object, you simply make it on the heap when you need it, using the new keyword. When you’re finished with the storage, you must release it using the delete keyword.
  The static storage area is simply a fixed patch of memory that is allocated before the program begins to run. 

   
 
从这段话可以理解出对象在栈中(stack)和静态区(static)程序员不能使用new和Delete来对其操作.因此栈中(stack)和静态区(static)的变量是不受程序员的程序控制的,既然不是由程序控制的?那是由誰控制的?其实可以这样理解的:由编译器控制的.

而堆(heap),C++的程序员则可以通过new 和delete的指令对其进行操作,因此給程序编写带来了灵活性.当然对于Java或者是C#的程序员来说,堆(heap)的控制也由不得他了,而是Java或C#内部的垃圾回收器帮程序员来打理,通常Java或者是C#的程序员只要new下就不用去delete了,这个delelte则是由内部的垃圾回收器去打理了

——转自[原创]栈(stack) 堆(heap) 静态区(static) 的区别 _clarketang_新浪博客

### 静态局部变量、静态全局变量、全局变量和局部变量的存储位置 #### 静态局部变量 静态局部变量存储在**静态存储区**,而非中。这种变量在其首次定义时被初始化,并在整个程序运行过程中持续存在[^1]。这使得静态局部变量能够在函数调用之间保持其值不变。 #### 静态全局变量 静态全局变量同样位于**静态存储区**。虽然它的作用域受限于定义它的文件内,但它与其他全局变量一样,在程序启动时分配内存,并一直保留到程序结束[^3]。 #### 全局变量 全局变量也存放在**静态存储区**。它们在整个程序范围内可访问(除非被声明为静态),并且像静态全局变量一样,在程序加载时分配空间并保持有效直到程序终止[^4]。 #### 局部变量 普通局部变量则位于**区**。每次进入新的作用域(如函数或循环体内)都会创建这些临时使用的变量;当退出相应的作用域后,这些局部变量会被立即销毁,其所占用的空间也会被释放回系统以供后续使用[^2]。 --- ### 和静态存储区的区别 #### - **特点**: 动态分配,由程序员显式请求(如 C 中的 `malloc` 或 C++ 中的 `new`)并负责释放(如 `free` 或 `delete`)。如果未能正确释放可能会导致内存泄漏。 - **适用场景**: 大型数据结构或需要跨多个函数甚至模块共享的数据对象。 - **生命周期**: 从分配开始至显式释放为止。 #### - **特点**: 自动管理,遵循先进后出原则(LIFO)。随着函数调用与返回自动完成内存分配与回收。 - **适用场景**: 小规模、短寿命的数据项,尤其是函数参数及局部变量。 - **生命周期**: 函数调用期间有效,离开作用域即刻消失。 #### 静态存储区 - **特点**: 编译期已知大小且固定不变的数据存放于此,包括所有全局变量、静态变量等。这部分内存由操作系统统一管理和维护,无需开发者介入。 - **适用场景**: 数据需贯穿整个程序执行周期的情况,例如配置选项或其他持久状态信息。 - **生命周期**: 整个程序运行期间始终存在,随进程终结而清除。 ```c++ // 示例代码展示不同类型的变量及其存储位置 #include <iostream> using namespace std; int globalVar = 0; // 全局变量,位于静态存储区 void exampleFunction() { static int staticLocalVar = 0; // 静态局部变量,位于静态存储区 int localVar = 0; // 普通局部变量,位于区 cout << "Global Variable Value: " << ++globalVar << endl; cout << "Static Local Variable Value: " << ++staticLocalVar << endl; cout << "Local Variable Value: " << ++localVar << endl; } int main(){ exampleFunction(); exampleFunction(); // 输出显示静态局部变量的状态得以维持 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值