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 应用程序和进行 ...
随机推荐
- Vue基础第二章
1.数据绑定与数据声明 Vue中的数据绑定就是让与Vue实例绑定的DOM节点或script标签内的变量之间数据更新互相影响,即数据绑定后Vue实例的数据修改会使DOM节点的数据或者script标签内的 ...
- python打开文件的方式
r 以只读模式打开文件 w 以只写模式打开文件,文件若存在,首先要清空,然后(重新创建) a 以追加模式打开(从EOF开始,必要时创建新文件),把所有要写入文件的数据追加到文件的末尾,即使使 ...
- 跳跃表-原理及Java实现
跳跃表-原理及Java实现 引言: 上周现场面试阿里巴巴研发工程师终面,被问到如何让链表的元素查询接近线性时间.笔者苦思良久,缴械投降.面试官告知回去可以看一下跳跃表,遂出此文. 跳跃表的引入 我们知 ...
- ztree多种数据包装以及相关设置
首先来一个完整的ztree代码 html代码 <form id="addTreeDataFrm" method="post" class="fo ...
- POJ-1904-King‘s Quest
链接: https://vjudge.net/problem/POJ-1904 题意: Once upon a time there lived a king and he had N sons. A ...
- Python Number(数字) Ⅰ
Python Number(数字) Python Number 数据类型http://www.xuanhe.net/用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的 ...
- 16.合并两个排序的链表(python)
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. class Solution: # 返回合并后列表 def Merge(self, pHead1 ...
- #418 Div2 Problem B An express train to reveries (构造 || 全排列序列特性)
题目链接:http://codeforces.com/contest/814/problem/B 题意 : 有一个给出两个含有 n 个数的序列 a 和 b, 这两个序列和(1~n)的其中一个全排列序列 ...
- Mybatis学习笔记之---编写dao实现类的CRUD
Mybatis编写dao实现类的CRUD 1.pom.xml <dependencies> <dependency> <groupId>junit</grou ...
- nginx报错 nginx: [alert] kill(25903, 1) failed (3: No such process)
当nginx 中报错 时 nginx报错 nginx: [alert] kill(25903, 1) failed (3: No such process) 通过在nginx/sbin,目录下 运行命 ...