首页 > 系统相关 >c++核心编程—内存分区模型

c++核心编程—内存分区模型

时间:2023-04-14 23:35:28浏览次数:42  
标签:释放 编程 堆区 局部变量 程序 c++ 存放 内存 new

一、概述

c++在执行时,将内存大致分为4个区域

1、代码区:存放函数体的二进制代码,由操作系统进行管理

2、全局区:存放全局变量和静态变量以及常量

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

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

内存四区意义:

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

二、程序运行前

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

1、代码区

存放cpu执行的机器指令

代码区是共享的,目的是:对应频繁被执行的程序,仅需在内存有一份代码即可。

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

2、全局区

存放全局变量和静态变量

全局区还包含常量区字符串常量const修饰的全局变量等也存放于此

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

c++核心编程—内存分区模型_核心编程


注意:const修饰的局部变量,不在全局区!

示例:

c++核心编程—内存分区模型_内存四区_02


三、程序运行后

1、栈区

编译器自动分配释放,存放函数的参数(形参),局部变量

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

局部变量作为返回值,有以下三种情况:

1、返回指针

c++核心编程—内存分区模型_核心编程_03


2、返回引用

c++核心编程—内存分区模型_c++_04


3、返回值

c++核心编程—内存分区模型_内存四区_05


解释:

1、如果函数返回的是局部变量的值,不涉及地址,程序不会出错。

2、但是如果返回的是局部变量的地址(指针)或者引用的话,程序运行后会出错。

2、堆区

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

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

示例:

c++核心编程—内存分区模型_核心编程_06


3、new操作符

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

堆区开辟的数据,释放利用操作符delete

注意:new返回的是数据的指针

示例1:基本语法

c++核心编程—内存分区模型_c++_07


释放后,再次调用会出错!!!

c++核心编程—内存分区模型_核心编程_08


示例2:利用new创建一个数组

c++核心编程—内存分区模型_c++_09

c++核心编程—内存分区模型_c++_10


同样:删除后,继续 使用会报错!

c++核心编程—内存分区模型_c++_11


喜欢就点赞收藏吧~


标签:释放,编程,堆区,局部变量,程序,c++,存放,内存,new
From: https://blog.51cto.com/qiux/6191142

相关文章

  • N维整形向量类的c++实现
    题目如下:N维整型向量类【问题描述】线性代数里面我们学习过n维向量,请用类vector_N来封装n维整型向量,成员如下;私有数据成员:² 向量维数n,int型² 指针p,int型公有函数成员:无参默认构造函数,在该函数中,将n置0,将p置null;重载输入输出运算符,输入运算符,先指定向量维数,......
  • c++primer15面向对象程序设计
    除了“构造函数”和“析构函数”,父类的所有成员函数,以及数据成员,都会被子类继承!:补充赋值运算符继承问题(链接) 成员函数如果没被声明为虚函数,其解析过程发生在编译时而非运行时。       派生类引用或者指针向基类引用或者指针自动类型转换:参考能够在一个赋值......
  • 模板元编程与函数式
    参考:【公开课】现代C++进阶:模板元编程与函数式ppt和代码在高性能计算中,一般使用函数式和元编程,而不使用面向对象。简单的介绍:类型自动推导模板参数、模板特化简单的实例:#include<iostream>template<classT>Ttwice(Tt){returnt*2;}std::stringtwice(std::......
  • Paillier半同态加密算法及C++实现
    Paillier半同态加密系统详解及C++实现Paillier半同态加密系统详解及C++实现一、Paillier同态加密算法1.1基本概念1.2算法思路1.3加解密过程密钥生成KeyGeneration加密Encryption解密Decryption二、C++实现2.1实验环境Linux版本编译器版本2.2......
  • c++打卡第五天
    嵌套和递归一、嵌套调用。 1、嵌套调用是指在一个函数中调用另一个函数,也可以在一个类中使用另一个类作为成员变量。 2、实例 ①函数成员调用#include<iostream>usingnamespacestd;intfa2(inta){returna+1;}intfa1(intn){return2*fa2(n);}......
  • c++基本数据结构
    基本数据结构:一.线性表1.顺序结构线性表可以用普通的一维数组存储。你可以让线性表可以完成以下操作(代码实现很简单,这里不再赘述):返回元素个数。判断线性表是否为空。得到位置为p的元素。查找某个元素。插入、删除某个元素:务必谨慎使用,因为它们涉及大量元素的移动。......
  • c/c++快乐算法第一天
    c/c++感受算法乐趣(1)开始时间2023-04-14 18:31:47结束时间2023-04-14 22:06:02前言:经过两天的学习,是不是发现编程也挺简单的。其实不然,学好算法同时也是练习编程的关键一环。接下来每周末我将会带领你感受算法的乐趣。目前题目摘自c语言趣味编程100例清华大学出版社,我会根据编......
  • C++第三章课本例题
    游戏规则是:每个骰子有6面,点数分别为1、2、3、4、5、6。游戏者在程序开始时输入个无符号整数,作为产生随机数的种子。每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其他值则将此值作为自己的原数,继续第二轮、第三轮……直到某轮的和数等于......
  • 编程一小时2023.4.14
    1.#include<bits/stdc++.h>usingnamespacestd;classnumber{intfz,fm;friendnumberoperator+(number&n1,number&n2);public:number(inta=0,intb=1){fz=a;fm=b;}friendintgcd(inta,intb);friendintmin_gb(number&n1......
  • C++复习第六天(继承、多态)
    vector.clear()将size设置为0,capacity不变 继承//公共页面classBasePage{public:voidheader(){cout<<"首页、公开课、登录、注册...(公共头部)"<<endl;}voidfooter(){cout<<"帮助中心、交流合作、站内地图...(......