C++内存分区模型(代码区、全局区、栈区、堆区)

简介: C++内存分区模型(代码区、全局区、栈区、堆区)

一、代码区

代码区: 存放函数体的二进制代码,由操作系统进行管理的;(程序运行前)

存放CPU执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

二、全局区

全局区:存放全局变量和静态变量以及常量;(程序运行前)

全局变量和静态变量存放在此
全局区还包含了常量区,字符串常量和其他常量也存放在此
该区域的数据在程序结束后由操作系统释放
#include <iostream>
 
using namespace std;
//全局变量
int g_a = 10;
int g_b = 10;
//const修饰的全局变量,全局常量
const int c_g_a = 10;
 
int main() {
//局部变量
    int a = 10;
    int b = 10;
    cout << "局部变量a的地址:" << &a << endl;
    cout << "局部变量b的地址:" << &b << endl;
    cout << "全局变量g_a的地址:" << &g_a << endl;
    cout << "全局变量g_b的地址:" << &g_b << endl;
//    静态变量
    static int s_a = 10;
    static int s_b = 10;
    cout << "静态变量s_a的地址:" << &s_a << endl;
    cout << "静态变量s_b的地址:" << &s_b << endl;
//    常量
//字符串
    cout << "字符串的地址" << &"hello" << endl;
//    全局常量
    cout << "全局常量c_g_a的地址:" << &c_g_a << endl;
//    局部常量
    const int c_a = 10;
    cout << "局部常量c_a的地址:" << &c_a << endl;
    return 0;
}
 
 

常量区:0x63,局部区:0x40.

局部变量a的地址:0x63fe1c
局部变量b的地址:0x63fe18
全局变量g_a的地址:0x404010
全局变量g_b的地址:0x404014
静态变量s_a的地址:0x404018
静态变量s_b的地址:0x40401c
字符串的地址0x405085
全局常量c_g_a的地址:0x405000
局部常量c_a的地址:0x63fe14
C++中在程序运行前分为全局区和代码区代码区
特点是共享和只读
全局区中存放全局变量、静态变量、常量
常量区中存放const修饰的全局常量和字符串常量

三、栈区

栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。

由编译器自动分配释放,存放函数的参数值,
局部变量等注意事项: 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。


#include <iostream>
 
using namespace std;
 
int* func() {
    int a = 10; //局部变量存放在栈区,栈区数据在函数执行完成后,自动释放
    return &a; //返回局部变量地址
}
 
int main() {
    //接收函数返回的地址
    int* p = func();
    //    解指针打印
    cout << *p << endl;
    //    解指针打印
    cout << *p << endl;
    return 0;
}
 
 

x86运行会有问题

四、堆区

堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

由程序员分配释放,若程序员不释放,程序结束时由操作系统回收;
在C++中主要利用new在堆区开辟内存;
#include <iostream>
 
using namespace std;
 
int* func() {
    // 利用new关键字 可以讲数据开辟到堆区;
    //指针 本质也是局部变量,放在栈上,指针保存的数据是放在堆区
    int* p = new int(10);
    return p;
}
 
int main() {
    //接收函数返回的地址
    int* p = func();
    //    解指针打印
    cout << *p << endl;
    //    解指针打印
    cout << *p << endl;
    return 0;
}
 
 

释放堆区空间

#include <iostream>
 
using namespace std;
 
//1、new的基本语法
int *func() {
//    在堆区创建整形数据
// new返回是该数据类型的指针
    int *p = new int(10);
    return p;
}
 
void test01() {
    int *p = func();
    cout << *p << endl;
    cout << *p << endl;
//    释放堆区数据
    delete p;
    cout << *p << endl; //引发了异常: 读取访问权限冲突。
 
}
 
//2、在堆区利用new开辟数组
void test02() {
    int *arr = new int[10];
    for (int i = 0; i < 10; ++i) {
        arr[i] = i + 100;
    }
    for (int i = 0; i < 10; ++i) {
        cout << arr[i] << endl;
    }
//    释放数组
    delete[] arr;
}
 
int main() {
    test01();
    test02();
    return 0;
}
 
 


相关文章
|
5天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
18 4
|
25天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
28天前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
35 0
【C++打怪之路Lv6】-- 内存管理
|
1月前
|
C++
C/C++内存管理(下)
C/C++内存管理(下)
46 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
358 0
|
19天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
41 1
|
24天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
28天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
37 4
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
51 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配