简介

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++——堆、栈与内存管理的更多相关文章

  1. 栈 & 堆 |--> 内存管理

    内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...

  2. 《C#高级编程》学习笔记----c#内存管理--栈VS堆

    本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识 ...

  3. Java内存管理及GC算法

    概述 内存划分 虚拟机规范中将内存分为六大部分,分别为PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量及本地方法栈. 1.PC寄存器:线程独占: 2.JAVA虚拟机栈:线程独有:JAVA虚 ...

  4. 【Cocos2d-x 3.x】内存管理机制与源码分析

    侯捷先生说过这么一句话 :  源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...

  5. iOS-Objective-C内存管理

    内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...

  6. OC内存管理(MRC)

    首先说明一下几块存储区域: 栈区(局部变量.函数参数值) 堆区(对象.手动申请/释放内存) BSS区(未初始化的全局变量.未初始化的静态数据) 常量区(字符串常量以及初始化后的全局变量.初始化后的静态 ...

  7. C#下内存管理--垃圾收集

    章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介 对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止 ...

  8. Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)

    勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了JVM及其启动流程,今天介绍一下JVM内部的一些区域,以及具体的区域在运行 ...

  9. Spark内存管理机制

    Spark内存管理机制 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行 ...

随机推荐

  1. python 反射、动态导入

    1. 反射 hasattr(obj,'name')            # 判断对象中是否含有字符串形式的方法名或属性名,返回True.False getattr(obj,'name',None)  ...

  2. 跨域 (2) cors

    html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  3. 【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set

    一句话题意:给你一个凸包,每次可以插入一个点或者询问周长. 动态凸包裸题嘛,用\(Set\)实现.最初每个点坐标做乘三处理,便于取初始三角形的重心作为凸包判定原点. #include <bits ...

  4. Vue路由参数设置可有可无

    参数后面使用 ? id 后面加个 ‘ ? ’ ,将 id 设置为可选参数 { name: "index", path: '/p/:id?', component: resolve ...

  5. aspnet:MaxHttpCollectionKeys 不起作用

    场景: vs2010  webform  表单域长度,在webconfig中加入该节点,有的项目起作用,有的项目无效,不知道是什么原因??

  6. std::string 和 CString问题

    std::string stdTemp; CString strTemp; strTemp = stdTemp;    ;//这一步直接赋值可不可以 因为CString可以接受const char*的 ...

  7. k8s的node节点,执行kubectl get XXX报错

    报错现象: [root@localhost ~]# kubectl get nodes The connection to the server localhost:8080 was refused ...

  8. 【转】毛虫算法——尺取法

    转自http://www.myexception.cn/program/1839999.html 妹子满分~~~~ 毛毛虫算法--尺取法 有这么一类问题,需要在给的一组数据中找到不大于某一个上限的&q ...

  9. javascript 链式调用+构造函数

    前几天面试,有一个问题是使用构造函数实现链式调用,后面查看了一些简单的资料,整理一下 首先,先说一下JS 中构造函数和普通函数的区别,主要分为以下几点 1.构造函数也是一个普通函数,创建方式和普通函数 ...

  10. Jmeter -- 上下文关联(JSON提取器)

    目标: 将请求A响应数据的部分内容提取出来,保存成变量供后续请求使用(用在返回格式为json的HTTP请求中) 步骤: 1. 添加JSON Extractor后置处理器 add --> post ...