C++——堆、栈与内存管理
简介
Stack,是存在于某作用域(scope) 的一块内存空间(memory space)。例如当你调用函数,函数本身即会形成一个stack 用來放置它所接收的参数,以及返回地址。在函数本体(function body) 內声明的任何变量,其所使用的內存块都取自上述stack。
Heap,也叫做system heap,是指由操作系统提供的一块global 內存空間,程序可动态分配(dynamic allocated) 从某中获得若干区塊(blocks)。
stack objects 的生命期
c1 便是所谓stack object,其生命在作用域(scope) 结束之际結束。这种作用域內的object,又称为auto object,因为它会被「自动」清理。
static local objects 的生命期
c2 便是所谓static object,其生命在作用域(scope)结束之后仍然存在,直到整个程序结束。
global objects 的生命期
c3 便是所谓global object,其生命在整个程序结束之后才结束。你也可以把它视为一种static object,其作用域是「整个程序」。
heap objects 的生命期
new:先分配memory, 再調用ctor
delete:先調用dtor, 再释放memory
VC下内存分配
array new 一定要搭配array delete
delete会被拆分成2个动作,其中第二个动作会把下图那一块删掉。删掉这一块依据的是cookie,21h表明了内存大小。delete[] p; 和 delete p;都不影响这块内存的删除。这一块内存并没有发生泄漏。
写成delete[] p; 这样,编译器才知道这是数组,他才会知道下面不只有1个,而是3个,进而调用3次dtor。每个对象死亡之前,调用dtor,把各自分配ed内存释放掉。
写成delete p; 这样,编译器会认为下面只有1个,因此只会调用一次析构函数。结果红框部分内存泄漏
如果使用复数的例子,根本没有指针,也不涉及动态分配。使用array new,而么有array delete也OK。因为他没要红框中的东西
但是我们不因该因此而掉以轻心,array new与array delete搭配是个好的编程习惯。
C++——堆、栈与内存管理的更多相关文章
- 栈 & 堆 |--> 内存管理
内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...
- 《C#高级编程》学习笔记----c#内存管理--栈VS堆
本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识 ...
- Java内存管理及GC算法
概述 内存划分 虚拟机规范中将内存分为六大部分,分别为PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量及本地方法栈. 1.PC寄存器:线程独占: 2.JAVA虚拟机栈:线程独有:JAVA虚 ...
- 【Cocos2d-x 3.x】内存管理机制与源码分析
侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...
- iOS-Objective-C内存管理
内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...
- OC内存管理(MRC)
首先说明一下几块存储区域: 栈区(局部变量.函数参数值) 堆区(对象.手动申请/释放内存) BSS区(未初始化的全局变量.未初始化的静态数据) 常量区(字符串常量以及初始化后的全局变量.初始化后的静态 ...
- C#下内存管理--垃圾收集
章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介 对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止 ...
- Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了JVM及其启动流程,今天介绍一下JVM内部的一些区域,以及具体的区域在运行 ...
- Spark内存管理机制
Spark内存管理机制 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行 ...
随机推荐
- Codeforces1238F. The Maximum Subtree(树形dp)
题目链接:传送门 思路: 题意说用线段的相交作为边,来构造树,所以不存在大于等于3个的线段两两相交,否则会构成环.因而构造出的树中,每个点最多只会与2个度大于1的节点相邻. 不妨把1设为树根,用deg ...
- Runnable和Thread比较
看代码 public static void main(String[] args) { // TODO Auto-generated method stub new MyThread().start ...
- Maven工程构建
Maven 相关术语: 本地资源库:用来存储项目的依赖库,默认的文件夹是 “.m2” 目录 中央存储库: 用来下载所有项目的依赖库的默认位置 Maven pom.xml: 项目对象模型(Project ...
- python之路day13--迭代器
迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...
- 【NOIP2016普及组复赛】魔法阵
题目 分析 设xd-xc为i,那么xb-xa=2i, 又因为xb-xa<(xc-xb)/3, 那么c>6i+b. 于是,先枚举i, 再分别枚举xa和xd, 根据之间的关系,用前缀和求出每一 ...
- 【NOIP2012模拟10.25】单元格
题目 在一个R行C列的表格里,我们要选出3个不同的单元格.但要满足如下的两个条件: (1)选中的任意两个单元格都不在同一行. (2)选中的任意两个单元格都不在同一列. 假设我们选中的单元格分别是:A, ...
- C# 、Java数组申明、初始化区别
一.数组申明 int[] a1 int a2[] C# 支持 不支持 Java 支持 支持 二.数组申明且初始化 int[] a1 = new int[] { 2, 31 } int a1[ ...
- select 语句关键字优先级
1.select 语句优先级 select classid, userid, name, age from study where userid > 15 group by classid ha ...
- 【java工具类】POI导出excel
POI的maven依赖:<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&l ...
- TTTTTTTTTTT LA 4329 BIT模版
题意: 有n个打乒乓球的人,住在一排房子内,以房子的顺序从做到由,每个人都有一个不同的乒乓球等级ai.每次比赛需要三人,两人比赛和一人裁判,裁判必须居住在两个比赛者之间,且等级必须也在两个人之间.问最 ...