C++核心编程一:内存分区模型(持续更新)

简介: C++核心编程一:内存分区模型(持续更新)



🌙C++核心编程

🌏1 内存分区模型

C++程序在执行时,将内存大方向划分为4个区域

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的
  • 全局区:存放全局变量和静态变量以及常量
  • 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区意义:

不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程

🎄1.1 程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域

代码区:

存放 CPU 执行的机器指令

代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区:

全局变量和静态变量存放在此.

全局区还包含了常量区, 字符串常量和其他常量也存放在此.

该区域的数据在程序结束后由操作系统释放.

示例:

//全局变量
int g_a = 10;
int g_b = 10;
//全局常量
const int c_g_a = 10;
const int c_g_b = 10;
int main() {
  //局部变量
  int a = 10;
  int b = 10;
  //打印地址
  cout << "局部变量a地址为: " << (int)&a << endl;
  cout << "局部变量b地址为: " << (int)&b << endl;
  cout << "全局变量g_a地址为: " <<  (int)&g_a << endl;
  cout << "全局变量g_b地址为: " <<  (int)&g_b << endl;
  //静态变量
  static int s_a = 10;
  static int s_b = 10;
  cout << "静态变量s_a地址为: " << (int)&s_a << endl;
  cout << "静态变量s_b地址为: " << (int)&s_b << endl;
  cout << "字符串常量地址为: " << (int)&"hello world" << endl;
  cout << "字符串常量地址为: " << (int)&"hello world1" << endl;
  cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;
  cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;
  const int c_l_a = 10;
  const int c_l_b = 10;
  cout << "局部常量c_l_a地址为: " << (int)&c_l_a << endl;
  cout << "局部常量c_l_b地址为: " << (int)&c_l_b << endl;
  system("pause");
  return 0;
}

打印结果:

总结:

  • C++中在程序运行前分为全局区和代码区
  • 代码区特点是共享和只读
  • 全局区中存放全局变量、静态变量、常量
  • 常量区中存放 const修饰的全局常量 和 字符串常量

🎄1.2 程序运行后

栈区:

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

注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

示例:

int * func()
{
  int a = 10;
  return &a;
}
int main() {
  int *p = func();
  cout << *p << endl;
  cout << *p << endl;
  system("pause");
  return 0;
}

堆区:

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

在C++中主要利用new在堆区开辟内存

示例:

int* func()
{
  int* a = new int(10);
  return a;
}
int main() {
  int *p = func();
  cout << *p << endl;
  cout << *p << endl;
    
  system("pause");
  return 0;
}

总结:

堆区数据由程序员管理开辟和释放

堆区数据利用new关键字进行开辟内存

🎄1.3 new操作符

C++中利用new操作符在堆区开辟数据

堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete

语法: new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

示例1: 基本语法

int* func()
{
  int* a = new int(10);
  return a;
}
int main() {
  int *p = func();
  cout << *p << endl;
  cout << *p << endl;
  //利用delete释放堆区数据
  delete p;
  //cout << *p << endl; //报错,释放的空间不可访问
  system("pause");
  return 0;
}

示例2:开辟数组

//堆区开辟数组
int main() {
  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 后加 []
  delete[] arr;
  system("pause");
  return 0;
}

🕮2 总结

在代码的舞台上,C++翩翩起舞。

纵观代码的山川大地,无边的可能在眼前延展, C++,是智慧的风,吹动着科技的帆船。

用韵律的二进制,谱写着自由的交响曲, C++,是数字艺术的荣光,闪烁在信息的星空。

愿C++永远如诗,激励创造者的灵感。

渴望挑战C++的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多C++的奇迹吧。我们推出了引领趋势的💻C++专栏:《C++从基础到进阶》 ,旨在深度探索C++的实际应用和创新。🌐🔍

相关文章
|
1月前
|
存储 程序员 编译器
什么是内存泄漏?C++中如何检测和解决?
大家好,我是V哥。内存泄露是编程中的常见问题,可能导致程序崩溃。特别是在金三银四跳槽季,面试官常问此问题。本文将探讨内存泄露的定义、危害、检测方法及解决策略,帮助你掌握这一关键知识点。通过学习如何正确管理内存、使用智能指针和RAII原则,避免内存泄露,提升代码健壮性。同时,了解常见的内存泄露场景,如忘记释放内存、异常处理不当等,确保在面试中不被秒杀。最后,预祝大家新的一年工作顺利,涨薪多多!关注威哥爱编程,一起成为更好的程序员。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
C++构建 GAN 模型:生成器与判别器平衡训练的关键秘籍
生成对抗网络(GAN)是AI领域的明星,尤其在C++中构建时,平衡生成器与判别器的训练尤为关键。本文探讨了GAN的基本架构、训练原理及平衡训练的重要性,提出了包括合理初始化、精心设计损失函数、动态调整学习率、引入正则化技术和监测训练过程在内的五大策略,旨在确保GAN模型在C++环境下的高效、稳定训练,以生成高质量的结果,推动AI技术的发展。
97 10
|
3月前
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
83 3
|
3月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
249 4
|
4月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
4月前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
68 0
【C++打怪之路Lv6】-- 内存管理
|
4月前
|
C++
C/C++内存管理(下)
C/C++内存管理(下)
59 0
|
4月前
|
存储 Linux C语言
C/C++内存管理(上)
C/C++内存管理(上)
58 0
|
4月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
93 0
|
3月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
635 1