C++面向对象丨1. 内存分区模型

这篇具有很好参考价值的文章主要介绍了C++面向对象丨1. 内存分区模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Author:AXYZdong 硕士在读 工科男
有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!
CSDN@AXYZdong,CSDN首发,AXYZdong原创
唯一博客更新的地址为: 👉 AXYZdong的博客 👈
B站主页为:AXYZdong的个人主页

系列文章目录

  • C++基础入门丨1. 初识C++像极了C语言
  • C++基础入门丨2. 数据类型基础
  • C++基础入门丨3. 搞明白4类运算符——运算符
  • C++基础入门丨4. 程序结构有哪几种?——程序流程结构
  • C++基础入门丨5. 数组——一维数组和二维数组
  • C++基础入门丨6. 函数——定义、调用和声明
  • C++基础入门丨7. 指针——一文搞懂指针
  • C++基础入门丨8. 结构体——还需要知道这些

操作系统:Windows 10
IDE:Visual Studio 2019

1 四个内存分区

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

四个区域 作用
代码区 存放函数体的二进制代码,由操作系统进行管理的
全局区 存放全局变量静态变量常量
栈区 由编译器自动分配释放,存放函数的参数值,局部变量等
堆区 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
  • 不同区域存放的数据,赋予不同的生命周期,使得编程具有更强灵活性。

2 程序运行前

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

代码区:

  • 存放 CPU 执行的机器指令。

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

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

全局区:

  • 全局变量和静态变量存放在此。

  • 全局区还包含了常量区,字符串常量和其他常量也存放在此。存放 cons t修饰的 全局常量字符串常量

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

局部变量局部常量存放在栈区

3 程序运行后

程序运行后也分为两个区,栈区堆区

栈区:

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

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

#include <iostream>

using namespace std;

int * func()
{ 
	int  a = 10;	//局部变量存放在栈区
	return &a;
}

int main() {

	int * p = func();

	cout << *p << endl;
	cout << *p << endl;

	system("pause");

	return 0;
}

C++面向对象丨1. 内存分区模型

  • 第一次打印局部变量的地址时,由于编译器的保留作用,保留了一次局部变量的地址。
  • 第二次打印时,出现乱码,此时栈区的局部变量已经被释放。

堆区:

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

  • 在C++中主要利用关键字 new 在堆区开辟内存。

4 new操作符

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

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

语法: new 数据类型

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

#include <iostream>

using namespace std;

int * func()
{
	int * a = new int(10);	//使用new开辟一个堆区
	return a;
}

int main() {

	int * p = func();

	cout << *p << endl;
	cout << *p << endl;

	//利用delete释放堆区数据
	delete p;

	//cout << *p << endl; //报错,释放的空间不可访问

	system("pause");

	return 0;
}

C++面向对象丨1. 内存分区模型

#include <iostream>

using namespace std;

int main() {

	int * arr = new int[3];		//堆区开辟数组

	for (int i = 0; i < 3; i++)
	{
		arr[i] = i + 1;
	}
	for (int j = 0; j < 3; j++)
	{
		cout << arr[j] << endl;
	}
	delete[] arr;	//释放数组 delete 后加 []

	system("pause");

	return 0;
}

C++面向对象丨1. 内存分区模型

Reference

  • [1]:https://www.bilibili.com/video/BV1VJ411M7WR

—— END ——


如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留言。或者你有更好的想法,欢迎一起交流学习~~~

更多精彩内容请前往 AXYZdong的博客 文章来源地址https://www.toymoban.com/news/detail-417451.html

到了这里,关于C++面向对象丨1. 内存分区模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++奇迹之旅:探索类对象模型内存的存储猜想

    上回我们学习了类的定义,初步了解了什么是类?类的定义,以及类的三个访问限定符: public , private , protected ,本小节将讲解类的实例化,类对象模型的猜想存储,及三种简单类的计算。 在 C++ 中,类的实例化是指创建一个类的对象。当我们定义了一个类之后,就可以根据

    2024年04月12日
    浏览(38)
  • 【C++初阶】三、类和对象(面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】二、入门知识讲解 (引用、内联函数、auto、基于范围的for循环、指针空值

    2024年02月04日
    浏览(40)
  • 面向对象的介绍和内存

    学习面向对象内容的三条主线 • Java 类及类的成员 :(重点)属性、方法、构造器;(熟悉)代码块、内部类 • 面向对象的特征 :封装、继承、多态、(抽象) • 其他的使用 :this、super、package、import、static、final、interface、 abstract 等 程序设计的思路 面向对象,

    2024年02月08日
    浏览(35)
  • Java面向对象思想以及原理以及内存图解

    面向过程 :面向过程是将解决问题的思路转为一个个方法。 面向对象 :面向对象则是编写一个对象,将这些思路封装成一个个对象方法,后续调用这个对象解决问题,相对面向过程而言,这种思路更符合人的思维并且更易扩展、复用、维护。 面向对象和面向过程性能差距:人们

    2024年02月04日
    浏览(45)
  • c++内存的四大分区详解

    目录 前言: 1、程序的基本运行流程 2,为啥要分为四个区域? 3,分为哪四个区域? 4,4个区域详解 代码区: 为什么会设置这两个功能呢? 全局区: 栈区: 堆区:  new: 补充知识:new 总结: 这篇博客介绍 c++四大分区 的详解,其中也会涉及到有关 new 的知识

    2024年02月20日
    浏览(40)
  • <C++> 类和对象-面向对象

    C语言是 面向过程 的,关注的是过程,分析出求解问题的步骤, 通过函数调用逐步解决问题。 C++是基于 面向对象 的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函

    2024年02月14日
    浏览(46)
  • 【Java基础教程】(七)面向对象篇 · 第一讲:上干货!面向对象的特性、类与对象、内存结构引用分析、垃圾收集器 GC处理、封装性详解、构造方法、匿名对象、简单 Java 类~

    程序是将数据和逻辑封装在一起的代码段。在Java中,方法是常用的代码段封装方式。然而,在Java中,方法必须存在于一个类中才能使用。因此,我们将进入本章的核心内容——面向对象编程。 利用面向对象设计的程序可以实现代码的重用,并方便开发者进行项目维护。面向

    2024年02月13日
    浏览(44)
  • <C++> 类和对象(上)-面向对象

    C语言是 面向过程 的,关注的是过程,分析出求解问题的步骤, 通过函数调用逐步解决问题。 C++是基于 面向对象 的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函

    2024年02月11日
    浏览(53)
  • 进一步了解C++函数的各种参数以及重载,了解C++部分的内存模型,C++独特的引用方式,巧妙替换指针,初步了解类与对象。满满的知识,希望大家能多多支持

    C++的编程精华,走过路过千万不要错过啊!废话少说,我们直接进入正题!!!! 函数默认参数 在C++中,函数的形参列表中的形参是可以有默认值的。 语法 : 返回值类型 函数名 (参数 = 默认值){} 示例 : 函数占位参数 C++中函数的形参列表里可以有占位参教,用来做占位

    2023年04月17日
    浏览(57)
  • C++核心编程——内存分区、引用、函数提高和函数重载

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ==== 第3阶段-C++核心编程 , --------

    2024年01月22日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包