内存管理

STL中的内存分配器原理

丶灬走出姿态 提交于 2020-03-21 18:52:44
题记:内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略。 1. STL容器简介 STL提供了很多泛型容器,如vector,list和map。程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写。例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_back(10); array.push_back(2); vector会根据需要自动增长内存,在array退出其作用域时也会自动销毁占有的内存,这些对于用户来说是透明的,stl容器巧妙的避开了繁琐且易出错的内存管理工作。 2.

STL的内存分配器

耗尽温柔 提交于 2020-03-21 18:51:25
题记: 内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如 linux内核 的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。 最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略。 1. STL容器简介 STL提供了很多泛型容器,如vector,list和map。程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写。例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_back(10); array.push_back(2); vector会根据需要自动增长内存,在array退出其作用域时也会自动销毁占有的内存,这些对于用户来说是透明的,stl容器巧妙的避开了繁琐且易出错的内存管理工作。 2

stl内存管理

心已入冬 提交于 2020-03-21 18:50:23
STL提供了很多泛型容器,如vector,list和map。程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写。例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_back(10); array.push_back(2); vector会根据需要自动增长内存,在array退出其作用域时也会自动销毁占有的内存,这些对于用户来说是透明的,stl容器巧妙的避开了繁琐且易出错的内存管理工作。 隐藏在这些容器后的内存管理工作是通过STL提供的一个默认的allocator实现的。当然,用户也可以定制自己的allocator,只要实现allocator模板所定义的接口方法即可,然后通过将自定义的allocator作为模板参数传递给STL容器,创建一个使用自定义allocator的STL容器对象,如: stl::vector<int, UserDefinedAllocator> array; 大多数情况下,STL默认的allocator就已经足够了

Python变量内存管理

◇◆丶佛笑我妖孽 提交于 2020-03-21 16:39:49
目录 一、变量存哪了? 二、Python垃圾回收机制 2.1 引用计数 三、小整数池 一、变量存哪了? x = 10 当我们在p1.py中定义一个变量 x = 10 ,那么计算机把这个变量值10存放在哪里呢了?我们回顾计算机的三大核心组件为:CPU、内存和硬盘。一定不是CPU,那是存放在内存还是硬盘中了呢?我们再回顾变量运行的三个过程,如果我们没有使用python解释器运行p1.py这个文件,那么 x=10 很明显只是很普通的四个字符x、=、1、0。而只有Python解释器运行了这个文件,那字符进入了内存,才会有变量这个概念。也就是说变量是存放在内存当中的。 变量存放在内存中这句话太宽泛了,我们把它具体化。现在想象我们在学校(电脑内存)里上课,学校每开一个班,学校都会开辟一个教室给这个班级上课用(存放变量值10),而班级的门牌号则是(变量名x)。也就是说,对于电脑内存这个大内存,每定义一个变量就会在这个大内存中开辟一个小空间,小空间内存放变量值10,然后内存给这个小空间一个变量名x(门牌号),x指向10。 二、Python垃圾回收机制 对于p1.py,如果我们再加上一段代码 x = 11 ,大内存会开辟另一个小空间存储变量值11,把变量值绑定另一个门牌号x,但是由于之前有x,所以大内存会解除x与10的连接,让x与11连接。这个时候10由于没有了门牌号

Linux 内存泄露调试工具

旧城冷巷雨未停 提交于 2020-03-19 22:54:23
用C/C++开发其中最令人头疼的一个问题就是内存管理,有时候为了查找一个内存泄漏或者一个内存访问越界,需要要花上好几天时间,如果有一款工具能够帮助我们做这件事情就好了,valgrind正好就是这样的一款工具。 Valgrind是一款基于模拟linux下的程序调试器和剖析器的软件套件,可以 运行于x86, amd64和ppc32架构上。valgrind包含一个核心,它提供一个虚拟的CPU运行程序,还有一系列的工具,它们完成调试,剖析和一些类似的任 务。valgrind是高度模块化的,所以开发人员或者用户可以给它添加新的工具而不会损坏己有的结构。 valgrind的官方网址是:http://valgrind.org 你可以在它的网站上下载到最新的valgrind,它是开放源码和免费的。 一、介绍 valgrind包含几个标准的工具,它们是: 1、memcheck memcheck探测程序中内存管理存在的问题。它检查所有对内存的读/写操作,并截取所有的malloc/new/free/delete调用。因此memcheck工具能够探测到以下问题: 1)使用未初始化的内存 2)读/写已经被释放的内存 3)读/写内存越界 4)读/写不恰当的内存栈空间 5)内存泄漏 6)使用malloc/new/new[]和free/delete/delete[]不匹配。 2、cachegrind

linux内存管理(16) - volatility

主宰稳场 提交于 2020-03-17 11:59:41
了解volatility 1.Linux Memory Extractor 参考此链接   A Loadable Kernel Module (LKM) which allows for volatile memory acquisition from Linux and Linux-based devices, such as Android. This makes LiME unique as it is the first tool that allows for full memory captures on Android devices. It also minimizes its interaction between user and kernel space processes during acquisition, which allows it to produce memory captures that are more forensically sound than those of other tools designed for Linux memory acquisition. 调试步骤: ~/Documents/work/code/LiME/src$ make make -C /lib/modules/4.19.37/build M="/home

备战2020:那些 iOS开发 常用的底层面试题合集!

心不动则不痛 提交于 2020-03-12 19:06:28
一、Runtime 一个objc对象的isa的指针指向什么?有什么作用? 一个 NSObject 对象占用多少内存空间? 说一下对 class_rw_t 的理解? 说一下对 class_ro_t 的理解? 说一下对 isa 指针的理解 说一下 Runtime 的方法缓存?存储的形式、数据结构以及查找的过程? 使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么? 实例对象的数据结构? 什么是method swizzling(俗称黑魔法) 什么时候会报unrecognized selector的异常? 如何给 Category 添加属性?关联对象以什么形式进行存储? 能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么? 类对象的数据结构? runtime如何通过selector找到对应的IMP地址? runtime如何实现weak变量的自动置nil?知道SideTable吗? objc中向一个nil对象发送消息将会发生什么? objc在向一个对象发送消息时,发生了什么? isKindOfClass 与 isMemberOfClass Category 在编译过后,是在什么时机与原有的类合并到一起的? Category 有哪些用途? Category 的实现原理? _objc_msgForward函数是做什么的

Python内存管理:垃圾回收

纵然是瞬间 提交于 2020-03-12 17:06:59
前言: 平时没接触过Python,但是关于垃圾回收面试时候被问到了,就学习一下为什么Python用的是引用计数法。 Python GC主要使用 引用计数 来跟踪和回收垃圾。在引用计数的基础上,通过 “标记-清除” 解决容器对象可能产生的 循环引用 问题,通过 “分代回收” 以空间换时间的方法提高垃圾回收效率。 引用计数 引用计数法在对象内部维护了一个被其他对象引用数的引用计数值,当这个引用计数值为0时,说明这个对象不再被其他对象引用,就可以被回收了。 所有Python对象的头部包含了这样一个结构PyObject(相当于继承自PyObject) struct _object { Py_ssize_t ob_refcnt; struct PyTypeObject *ob_type; } PyObject; ob_refcnt就是引用计数值 可能会出现两个对象循环引用, 导致垃圾回收器都不会回收它们,所以就会导致内存泄露。 优点: 高效; 运行期没有停顿; 对象有确定的生命周期; 易于实现 缺点: 维护引用计数的次数和引用次数成正比,而不像标记-清除那样与回收的内存数量有关。 无法解决循环引用的问题。 标记-清除 “标记-清除”法是为了解决循环引用问题。在申请内存时,所有容器对象的头部又加上了 PyGC_Head 来实现“标记-清除”机制。 typedef union _gc_head

C与C艹的内存管理方式

自古美人都是妖i 提交于 2020-03-10 08:57:12
  C 内存开辟出的空间一般可以分成: 代码段,数据段( 初始化的数据段, 为初始化的数据段BSS ),堆,栈   代码段 :保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写   数据段 :保存初始化的全局变量和静态变量,可读可写不可执行   BSS :未初始化的全局变量和静态变量   堆(Heap) :动态分配内存,向地址增大的方向增长,可读可写可执行     栈(Stack) :存放局部变量,函数参数,当前状态,函数调用信息等, 向地址减小的方向增长 ,非常非常重要,可读可写可执行      最特别的是 栈stack ,它和别人是反着的!在Windows平台上,栈都是从上(高)向下(低)生长的!。   关于函数调用举个例子: int i= 0x22222222; char szTest [] = "aaaa";//a的ASCII码为0x61 func(i, szTest);   当访问进入func函数时,栈中的形式为(左侧地址 右侧数据):   0x0013FCF0 0x0013FCF8   0x0013FCF4 0x22222222   0x0013FCF8 0x61616161 PS: c++中语句解析顺序和函数调用时候顺序一致:由右向左! 比如如下语句,在输入vector为空时会造成 访问越界! void numIslands(vector<vector

操作系统动态内存管理——malloc和free的工作机制

给你一囗甜甜゛ 提交于 2020-03-10 08:55:20
动态 内存分配 就 是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。 malloc()是 C语言 中动态 存储管理 的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数, 返回值 是一个指向所分配的连续存储域的起始地址的指针。 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足 用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传 给用户,并将剩下的那块(如果有的话)返回到连接表上。 调用free函数时,它将用户释放的内存块连接到空闲链上。 空闲链会被切成很多的小内存片 段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检 查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。然后再次进行查找,把合适的内存块返回。   来源: https://www.cnblogs.com/ygj0930/p/6539397.html