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)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
随机推荐
- Java定时任务实现优惠码
在Java中实现定时任务来发放优惠码,我们可以使用多种方法,比如使用java.util.Timer类.ScheduledExecutorService接口,或者更高级的框架如Spring的@Sched ...
- rgba和opacity的透明效果有什么不同?
rgba()和opacity都能实现透明效果,但最大的不同是opacity作用于元素,以及元素内的所有内容的透明度, 而rgba()只作用于元素的颜色或其背景色.(设置rgba透明的元素的子元素不会继 ...
- Spark大数据集群日常开发过程遇到的异常及解决思路汇总
总结/朱季谦 一.出现java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V ...
- c 语言学习第二天
常量 字符串常量 字符 例如:'f','i','z','a'编译器为每个字符分配空间. 'f' 'i' 'z' 'a' 字符串 例如:"hello"编译器为字符串里的每个字符分配空 ...
- Solo开发者社区-H5-Dooring, 开箱即用的零代码搭建平台
Dooring-Saas 是一款功能强大,高可扩展的零代码解决方案,致力于提供一套简单方便.专业可靠.无限可能的页面可视化搭建最佳实践.(Solo社区 投稿) 功能特点 可扩展, Dooring 实现 ...
- 解决方案 | 将时间转换为毫秒bat
@echo off setlocal enabledelayedexpansion rem 输入的时间 set "time_input=00:07:07.1" rem 解析时间 f ...
- PHP中的__autoload()和spl_autoload_register()
php的__autoload函数是一个魔术函数,在这个函数出现之前,如果一个php文件里引用了100个对象,那么这个文件就需要使用include或require引进100个类文件,这将导致该php文件 ...
- 手写数字识别-使用TensorFlow构建和训练一个简单的神经网络
下面是一个具体的Python代码示例,展示如何使用TensorFlow实现一个简单的神经网络来解决手写数字识别问题(使用MNIST数据集).以下是一个完整的Python代码示例,展示如何使用Tenso ...
- 第十二节 JMeter基础-中级地址信息【IF控制器】
声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改. 背景:提交订单前,我们需要核对一些信息,比如商品信息,收货地址,支付方式等.现在核对一下收货地址信息. 思路: 1.前提条件 ...
- python 私有属性的作用
python 私有属性的作用 class Player(): def __init__(self, name, power, skill): self.name = name self.power = ...