C++内存管理详解:各类变量的存储区域

    在C++中,变量的存储位置取决于它们的类型和生命周期。那么不同的各个变量究竟存储在哪个区域呢?

1.不同类型的变量

我们首先从变量类型的不同来说明:

1. 全局变量和静态变量 

- 存储区:全局/静态区(静态区)
- 说明:全局变量(包括文件级和函数级的)和使用 `static` 关键字声明的变量存储在静态区中。它们在程序启动时被分配,并在程序结束时销毁,具有整个程序的生命周期。

int globalVar; // 全局变量
int main()
{
     static int staticVar; // 静态变量
     return 0;
}

2. 局部变量

- 存储区:栈区(Stack)
- 说明:局部变量是在函数或代码块内部声明的变量。它们在函数执行时分配,在函数退出后销毁。栈区的分配和释放速度很快,但栈区的大小有限。

    void func() {
      int localVar; // 局部变量
    }

3. 动态分配的变量

- 存储区:堆区(Heap)
- 说明:通过 new、malloc等动态分配的变量存储在堆区中。堆区的内存由程序员手动管理,使用 new分配后需要手动 delete,malloc分配后需要 free释放,否则可能会导致内存泄漏。

    int* p = new int; // 动态分配的变量
    delete p;
    指针变量p作为局部变量存储在栈区
    ,p通过new分配的内存空间在堆区

4. 常量

- 存储区:常量存储区(常量区)
- 说明:字符串常量和const修饰的全局变量等通常存储在常量区。这个区域是只读的,无法修改。

    const int constVar = 100; // 常量
constVar是一个const修饰的局部变量,存储在栈区,100存储在
程序的只读数据段(常量区)
    const char* str = "Hello"; // 字符串常量
str是一个局部变量,存储在栈区,它保存的是字符串常量“hello”
的地址,“hello”存储在产量区(也称只读数据区),因为他是不
可修改的字符串的字面值

5. 函数参数

- 存储区:栈区(Stack)
- 说明:函数参数在函数调用时压入栈中,当函数返回时这些参数被销毁。

6. 静态局部变量

- 存储区:全局/静态存储区(静态区)
- 说明:静态局部变量只在函数中初始化一次,并在整个程序运行期间保留它的值,但它的作用域仍然在定义它的函数中。

    void func() {
      static int staticLocalVar = 0; // 静态局部变量
    }

2.内存分配区域

我们再从内存分配的5个主要区域来说明:
1. 栈区(Stack Segment):局部变量、函数参数、返回地址。
2. 堆区(Heap Segment):动态分配的内存。
3. 全局/静态存储区(Data Segment):
   - 已初始化数据段:已初始化的全局变量和静态变量。
   - 未初始化数据段:未初始化的全局变量和静态变量。
4. 常量区(Text/ROData Segment):字符串常量、`const` 修饰的全局常量。
5. 代码区(Code Segment or Text Segment):存储程序的可执行代码。

接下来我们来详细介绍这五块区域:

 1. 栈区(Stack Segment)

    - 特点:用于存储局部变量函数参数返回地址。栈上的内存分配是自动管理的,即由编译器在函数调用时自动分配并在函数返回时自动释放。
   - 分配方式:由系统自动分配和释放,遵循后进先出(LIFO)的原则。
   - 优点&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值