c++学习笔记(一):内存分区模型
内存分区模型
c++在执行时,将内存大方向划分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理(编写的所有代码都会存放到该处)
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区的意义:
不同区域存放的数据,将被赋予不同的生命周期,能让我们更加灵活地进行编程
程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域
代码区:
存放CPU执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了他的指令
全局区:
全局变量和静态变量存放于此
全局区还包含了常量区,字符串常量和其他常量也存放在此
该区域的数据在程序结束后由操作系统释放
程序运行后
栈区:
由编译器自动分配释放,存放函数的参数值,局部变量等
Tips:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
int* func(int b)//形参数据也会放到栈区
{
int b = 100;
int a=10;//局部变量 存放在栈区,栈区的数据在函数执行完后自动释放
return &a;//返回局部变量的地址
}
int main()
{
//接受func函数的返回值
int * p = func(1);
std::cout <<* p <<std::end1; //第一次可以打印正确结果,是因为编译器做了保留
std::cout <<* p <<std::end1; //第二次打印乱码,是因为第二次不再做保留
system("pause");
return 0;
}
堆区:
由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
在c++中主要利用new在堆区开辟内存
int * func()
{
//利用new关键字 可以将数据开辟到堆区
//指针 本质上也是局部变量,放在栈上,但指针保存的数据是存放在堆区
int * p = new int(10); //这里new返回了一个地址给指针p
return p;
}
int main()
{
//在堆区开辟数据
int * p = func();
//不主动释放内存的话堆区数据一直存在,因此四次打印结果无误
std::cout<<*p<<std::endl;
std::cout<<*p<<std::endl;
std::cout<<*p<<std::endl;
std::cout<<*p<<std::endl;
return 0;
}
new操作符
c++中利用new操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟、手动释放,释放利用操作符delete
语法:new 数据类型
//1.new的基本语法
int * func()
{
//在堆区创建整型数据
//new返回的是该数据类型的指针
int * p = new int(10);
return p;
}
void test1()
{
int * p = func();
std::cout<<*p<<std::endl;
std::cout<<*p<<std::endl;
std::cout<<*p<<std::endl;
//堆区的数据由程序员管理开辟,管理员管理释放
//如果想释放堆区的数据,利用关键字delete
delete p;
std::cout<<*p<<std::endl;//内存已经被释放,再次访问是非法操作会报错
return 0;
}
//2.在堆区利用new开辟数组
void test2()
{
//在堆区创建10个元素整型数据的数组
int * arr = new int[10]; //10代表数组有10个元素
//赋值
for (int i = 0;i < 10; i++)
{
arr[i] = i + 100;
}
//输出
for (int i = 0;i < 10; i++)
{
std::cout<<arr[i]<<std::endl;
}
//释放堆区数组
//释放堆区数组时,要加[]才能成功释放
delete[] arr;
}
c++学习笔记(一):内存分区模型的更多相关文章
- Java学习笔记之---单例模型
Java学习笔记之---单例模型 单例模型分为:饿汉式,懒汉式 (一)要点 1.某个类只能有一个实例 2.必须自行创建实例 3.必须自行向整个系统提供这个实例 (二)实现 1.只提供私有的构造方法 2 ...
- ArcGIS案例学习笔记-批量裁剪地理模型
ArcGIS案例学习笔记-批量裁剪地理模型 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:空间数据的批量裁剪 优点:1.批量裁剪:任意多个目标数据,去裁剪任意 ...
- MySQL学习笔记-数据库内存
数据库内存 InnoDB存储引擎内存由以下几个部分组成:缓冲池(buffer pool).重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool ...
- linux kernel学习笔记-5内存管理_转
void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...
- WebGL three.js学习笔记 加载外部模型以及Tween.js动画
WebGL three.js学习笔记 加载外部模型以及Tween.js动画 本文的程序实现了加载外部stl格式的模型,以及学习了如何把加载的模型变为一个粒子系统,并使用Tween.js对该粒子系统进行 ...
- XV6学习笔记(2) :内存管理
XV6学习笔记(2) :内存管理 在学习笔记1中,完成了对于pc启动和加载的过程.目前已经可以开始在c语言代码中运行了,而当前已经开启了分页模式,不过是两个4mb的大的内存页,而没有开启小的内存页.接 ...
- [C++核心编程] 1、内存分区模型
文章目录 1 内存分区模型 1.1 程序运行前 1.2 程序运行后 1.3 new操作符 1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进 ...
- ARMV8 datasheet学习笔记5:异常模型
1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32.AArch64架 ...
- Javascript MVC 学习笔记(一) 模型和数据
写在前面 近期在看<MVC的Javascript富应用开发>一书.本来是抱着一口气读完的想法去看的.结果才看了一点就傻眼了:太多不懂的地方了. 仅仅好看一点查一点,一点一点往下看吧,进度虽 ...
- PowerDesigner 15学习笔记:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
随机推荐
- hadoop集群配置文件
配置文件与功能对应: 修改core-site.xml文件 <property> <name>fs.defaultFS</name> <!--配置hdfs系统的 ...
- 【ClickHouse】4:clickhouse基本操作二 建库建表导数据
背景介绍: 有三台CentOS7服务器安装了ClickHouse HostName IP 安装程序 程序端口 centf8118.sharding1.db 192.168.81.18 clickhou ...
- P9376 题解
首先考虑怎么暴力. 考虑把每个数进行 \(B\) 进制分解,然后我们惊奇的发现这两个操作就是把最低位去掉和往最低位后面插入一个数. 然后我们顺藤摸瓜,把每个数的分解扔到 Trie 树上,我们发现我们要 ...
- 安装phpgjx工具
直接按照phpgjx配置文件进行安装. 重启mysql和访问phpgjx都会生成配置的日志文件 按照文档安装可能日志文件中不会产生SQL记录 解决方案: 可以进入mysql后,查看该日志是否开启 / ...
- socket通讯原理及例程(一看就懂
来源:https://blog.csdn.net/jiushimanya/article/details/82684525 里面有疑问或者不正确的地方可以给我留言 对TCP/IP.UDP.Socket ...
- 可视化—D3学习笔记小小案例记录一下
D3全称是Data-Driven Documents数据驱动文档,是一个开源的javascript库,可以用于数据可视化图形的创建,该库更接近底层,与 g2.echarts 不同,d3 能直接操作 s ...
- [oeasy]python0086_ASCII_出现背景_1963年_DEC_PDP系列主机_VT系列终端
编码进化 回忆上次内容 上次 回顾了 字符编码的新陈代谢 ibm 曾经的EBCDIC 由于 字符不连续 导致 后续 出现无数问题 随着 网络的发展 数据交换的 需要 原来的小隐患 现在 产生了 巨大问 ...
- MySQL之DML
DQL:SELECT * FROM 表名 DML(数据操作语言,它是对表记录的操作(增.删.改)!) 1. 插入数据 * INSERT INTO 表名(列名1,列名2, ...) VALUES(列值1 ...
- Fiddler 使用fiddler无法抓取苹果手机https请求问题解决方案
使用fiddler无法抓取苹果手机https请求问题解决方案 by:授客 QQ:1033553122 测试环境 Win10 Fiddle4 IPhone6s 问题描述 使用fiddler抓取IPh ...
- 【GeoScene】一、创建、发布路网服务,并在代码中测试最短路径分析
前言 网上关于GeoScene及GeoScene API for JavaScript的资料太少了,官方的技术支持又太慢了,最近把在项目中踩过的坑分享出来: **版本信息** GeoScene Pro ...