c++内存四区以及new、delete用法

2023-05-16

c++内存四区

        c++被执行时,将内存大方向划分了四个区域

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

内存四区的意义:

        不同区域存放的数据,赋予不同的生命周期,可以更灵活的编程。 

程序运行前

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

  • 代码区

存放CPU执行的机器指令。

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

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

  • 全局区

全局变量和静态变量存放于此。

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

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

小总结 :

         c++在程序运行前分为全局区和代码区

        代码区特点是共享和只读

        全局区中存放全局变量、静态变量、常量

        常量区存放const修饰的全局常量 和字符串常量

程序运行后

  • 栈区

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

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

形参数据也会放到栈区

  •  堆区

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

在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;

    system("pause");
    return 0;
}
  • new操作符

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

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

语法:new 数据类型

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

释放堆区数组时,delete后面要加[ ] 例:delete[ ]  arr;

#include <iostream>
using namespace std;

int* func()
{
    //在堆区创建整型数据
    //new返回是 该数据类型的指针
    int* p = new int(20);
    return p;
}

void test1()
{
    int* p = func();

    cout << *p << endl;
    cout << *p << endl;
    //堆区的数据由程序员管理开辟和释放
    //如果想要释放堆区数据,使用操作符delete
    delete p;
    //cout << *p << endl;  //内存已经被释放,再次访问就是非法操作,会报错
}

void test2()
{
    //在堆区用new开辟数组
    int* arr = new int[20];

    for(int i = 0; i < 20; i++)
    {
        arr[i] =i+ 100;
    }
    for (int i = 0; i < 20; i++)
    {
        cout << arr[i] << endl;
    }
    //释放堆区数组
    //释放堆区数组时,要加[ ]才可以
    delete[] arr;
}

int main()
{
    test1();
    test2();

    system("pause");
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++内存四区以及new、delete用法 的相关文章

  • openstack基础知识

    目录 一 云计算1 什么是云计算2 云计算的特色3 云计算的三种使用方式1 xff09 公有云2 xff09 私有云3 xff09 混合云 4 云计算服务模型1 xff09 IaaS 基础架构即服务 2 xff09 PaaS xff08 平
  • openstack-keystone

    目录 一 keystone身份服务二 keystone的主要功能三 keystone相关概念四 keystone认证流程五 OpenStack Keystone组件部署步骤部署步骤 一 keystone身份服务 keystone xff08
  • k8s-----------YAML&harbor

    目录 概述使用YAML文件创建资源1 查看资源版本的标签2 创建yaml文件测试 Pod1 特点2 pod容器分类3 镜像拉取策略 部署harbor1 登录harbor私有仓库2 下载Tomcat镜像进行推送3 推送 概述 Kubernet
  • k8s-----------高级pod&调度

    目录 pod进阶pod重启策略 健康检查 探针调度约束调度方式 故障排除 pod进阶 limits cup cpu上限limits memory 内存上限requests cpu 创建时分配的基本CPU资源requests memory 创
  • k8s-----------控制器

    目录 Deployment 部署无状态应用 Pod与控制器之间的关系 SatefulSet xff08 部署有状态应用 xff09 无状态和有状态无状态有状态 常规service和无头服务区别DaemonSetjobCronJob 控制器
  • 安装electron时安装失败解决

    错误描述 xff1a 在安装 electron 的时候 xff0c 使用官方推荐的如下命令 xff1a npm install save dev electron 结果报错如下 npm ERR code 1 npm ERR path D A
  • 10:天干地支

    10 天干地支 时间限制 1 S 内存限制 8192 KB Accept 15 Submit 41 提交 讨论版 描述 天干地支 xff0c 源自中国远古时代对天象的观测 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 称为十天干 xff0c 子
  • txt格式vscode转码

    txt打开异常 xff0c 或乱码 右下角有格式类型 xff1a utf 8 xff0c 点击它会有一个 select action 弹框 可选择特定格式重新打开 xff0c 或保存 选择好对应的格式 乱码解决 或者点击 save with
  • 送给 Java 程序员的 Spring 学习指南

    https www infoq cn article Ad 8ghcGGCNU572U6oEX 学习 Spring 的基础要求 Spring 官网首页是这么介绍自己的 Spring the source for modern Java xf
  • Centos下如果是二进制文件,编辑是文本,后缀是sh也无法执行

    这次部署redis遇到个问题 xff0c 执行sh文件来启动redis xff0c 结果报配置文件无法打开 用vi打开sh文件反复检查过路径是对的 然后手敲路径执行 xff0c 运行正常 xff1b 直接执行sh文件不行 xff1a 反复修
  • Python Pandas 查看数据信息 DataFrame.info()

    在进行数据分析之前 xff0c 需要先查看数据的信息 xff0c 这样才方便后续的数据处理 比如 xff0c 在excel表中20220520是一个常规类型的数据 xff0c 那它导入到DataFrame中是int类型还是str类型呢 xf
  • 03-1.MariaDB安装配置详细步骤

    Author xff1a Sickey Date xff1a 2021 11 25 安装前准备 配置静态IP防火墙等等 1 安装mariadb数据库 先查看RDO中MariaDB的版本及配置 etc my cnf d server cnf
  • 24行代码简单实现qq空间自动点赞

    什么是Auto js xff1f Auto js是基于JavaScript语言运行在Android平台上的工具 它依赖于无障碍服务 它可以做什么 xff1f 解放双手 xff0c 让手机自动打游戏 自动签到 自动领红包等等等等 它有什么优点
  • 操作系统(C++)——生产者消费者模型

    一 C 43 43 实现代码 span class token macro property span class token directive hash span span class token directive keyword i
  • 2023.03.14java内置的线程池 -》 ScheduledExecutorService 具备延迟运行的能力!的使用

    区别 ScheduledExecutorService xff0c 执行任务方法为schedule xff0c 而不是submit es schedule new MyRunnable i 2 TimeUnit SECONDS 指定线程了线
  • sudo rm -rf /* 命令运行演示(管理员身份删除根目录所有文件)

    一 前言 闲来无事 xff0c 好奇传说中的 sudo rm rf 命令究竟有什么样的魅力让无数人趋之若鹜 xff0c 本着奉献精神 xff0c 作者将在自己的服务器上测试一番 xff0c 各位读者切勿轻易尝试 不 xff0c 切勿尝试 x
  • 服务器如何安装宝塔面板?

    一 前言 作者是按照宝塔面板官方指引进行下载的 xff0c 中间进行更为清晰明了的图示说明 宝塔官方说明 xff08 或者直接按下面步骤安装 xff09 xff1a 宝塔Linux面板安装教程 2021年8月18日更新 7 7 0正式版 L
  • 计算机网络体系结构(详图)

    本文旨在作学习记录 xff0c 其中 xff0c 图源的信息已标明 图源 xff1a 谢希仁的 计算机网络 图源 xff1a 网络
  • wordpress+宝塔在阿里云服务器上搭建个人博客(如何在服务器上搭建个人博客)

    目录 一 宝塔安装 1 开放端口 2 命令安装 二 环境安装 xff08 LNMP xff09 三 wordpress安装包下载 四 部署站点 四 博客访问 五 结语与参考 一 宝塔安装 宝塔官方安装教程 xff08 或者直接按下面步骤安装
  • docker-compose安装教程(包含docker安装教程)

    本文旨在学习记录 xff0c 该过程是作者经历过大大小小的十来次失败总结而来 xff0c 内容都是各方博客荟萃的结果 xff0c 下述内容都已实践成功 xff0c 若失败 xff0c 只需初始化云盘 xff0c 重新安装即可 xff0c 无

随机推荐