C++内存管理
文章平均质量分 77
侯捷的课的笔记
拾牙慧者
会点c++、python;
展开
-
连续内存分区式内存管理
前言内存管理模块主要负责内存的初始化、分配以及释放。从分配内存是否连续可以分为两大类:1、连续内存管理为进程分配的内存空间是连续的,但这种分配方式容易形成内存碎片,降低内存利用率。连续内存管理主要分为单一连续内存管理和分区内存管理两种。2、非连续内存管理将进程分散到多个不连续的内存空间种,可以减少内存碎片,内存使用率更高。如果分配的基本单位是页,则称为分页式内存管理;如果基本单位式段,则称为分段式内存管理目前的OS主要采用非连续内存管理。对于内存较小的嵌入式系统,一般采用连续内存管理。这里详原创 2021-10-14 19:49:31 · 682 阅读 · 0 评论 -
从源码角度剖析VC6下的内存分配与切割的运作
malloc与free带来的内存管理是应付小区块的,即SBH(small block heap),这点也可以从源代码中看出:VC6下会做门槛检测if(size <= __sbh_threshold) {pvReturn = __sbh_alloc_block(size);return pvReturn;}...return HeapAlloc(_crtheap,0,size)VC10下不会做门槛检测,它总是会调用系统提供的HeapAlloc。这是因为操作系统提供的函数也有类似的功能了原创 2021-02-21 21:08:41 · 423 阅读 · 0 评论 -
std::alloc具体细节
G2.9 std::alloc的缺点:1、在alloc::deallocate中没有将拿到的内存资源还给操作系统,在多任务中将占用很大资源2、alloc::deallocate函数没有检查传入的p指针的有效性。在这里它默认p为alloc::allocate取得。如果p并非alloc::allocate取得,该函数仍然可以将其并入回收,这不好。并且如果p所指的大小不是8的倍数的时候,会带来灾难。一些语法细节1、比较语句 == 左边写值,右边写变量,防止把==写成=编译能通过。如:2、如果使用指原创 2021-02-20 12:46:14 · 206 阅读 · 0 评论 -
嵌入式指针embedded pointer的概念以及用法
前言在针对一个class写出它的内存管理池以及总结出allocator类(三个版本)中内存管理池的第二个版本中涉及到了一个非常重要的概念:嵌入式指针。同时嵌入式指针也在G2.9版本的alloc中出现。现在整理一下网上的一些用法和概念概念嵌入式指针工作原理:借用A对象所占用的内存空间中的前4个字节,这4个字节用来 链住这些空闲的内存块;但是,一旦某一块被分配出去,那么这个块的 前4个字节 就不再需要,此时这4个字节可以被正常使用;从工作原理中可以看出嵌入式指针使用前提:类A对象的sizeof必须不小原创 2021-02-19 21:07:26 · 2326 阅读 · 6 评论 -
VC6、BC5、G2.9标准分配器一览
VC6标准分配器VCx中源码可以在电脑路径中找:[D:\Program Files\VisualStudio\Community\VC\Tools\MSVC\14.28.29333\include\xmemory]不过太多了,大概在837行左右有关于allocator代码。还是先看侯捷PPT上的吧。在VC中使用容器,都是通过allocator取得的。allocator都是通过调用malloc函数,所以都会有cookie。分配类型是通过元素类型为单位的。具体用法可以参考https://docs.原创 2021-02-19 11:15:55 · 796 阅读 · 4 评论 -
关于new handler与default、delete关键字
在https://blog.csdn.net/qq_42604176/article/details/111638568的operate_new源代码长啥样中谈到过new handler。当operator new不能够分配出申请的内存时,会抛出bad_alloc 异常。有的编译器会返回0.当定义成new(nothrow) Foo;就不会抛异常,而是返回0.再看源代码:当检查到异常时,会调用用户指定的handler函数。调用后再返回到while判断中调用一次分配内存函数。typedef void原创 2021-02-16 20:52:24 · 214 阅读 · 0 评论 -
针对一个class写出它的内存管理池以及总结出allocator类(三个版本)
如果我们不针对对象做内存管理,那么我们每次进行Foo* p = new Foo(x);时总是会调用malloc函数。尽管malloc函数很快,但是我们仍然有自己管理内存的必要。我们可以首先使用malloc函数申请一大段内存,然后切割成若干个小块,每次创建一个对象的时候就给一小块的内存。这样效率更高并且更容易管理。并且如果没有经过特殊设计,一次创建对象就调用一次malloc,一次malloc就会得到两个cookie(8个字节)。创建多个对象的时候这样就会比较浪费空间。内存池设计的目的就是要提高速度和降原创 2021-02-14 23:48:34 · 537 阅读 · 1 评论 -
关于placement new 和 placement delete的重载,以及basic_string重载new()实例
在https://blog.csdn.net/qq_42604176/article/details/111997397中已经介绍了placement new的形式。它的形式为new()/delete().我们将分配好内存的指针送入括号中,就完成了初步的调用了。其实我们可以定义放任何的东西到()内部。只放一个指针的版本是的new()是标准库先写好给我们的。我们可以重载operator new,并写出多个版本,如:Foo* pf = new(300,'c')Foo; //注意,这里没有传入指针前提原创 2021-02-11 17:29:11 · 446 阅读 · 0 评论 -
通过从全局和类内部重载operator new /delete来获取内存管理权
1、通过重载获得内存管理权之前的几长学习,是红色的路线。此时内存管理权限不在我们手中。接下来,通过class内部的重载operator new/delete,我们可以获得内存管理权力。注意operator new/delete,这张PPT里面有两个。一个是在class内部重载,还有一个是全局的重载。...原创 2021-02-10 21:43:10 · 312 阅读 · 0 评论 -
C++ 内存基本构件 placement new
用法以及编译器解释placement new 允许我们将object构建于已经分配的内存上。(所以此时必须有个指针指向已经分配好的内存)没有所谓的placement delete ,因为placement new根本没有分配内存.也有种说法,是将placement new对应的内存释放掉的操作为placement delete。char* buf = new char[sizeof(Complex)*3];Complex* pc = new(buf)Complex(1,2); //将对象分配在已经原创 2020-12-30 22:32:06 · 350 阅读 · 0 评论 -
C++ 内存基本构件new [] /delete []的意义、内存泄漏原因、VC下cookie的基本布局
一、对new [] delete [] 的理解以及delete的[]遗漏会带来什么影响 二、以示例探讨 三、cookie的理解原创 2020-12-25 15:50:22 · 334 阅读 · 1 评论 -
C++ 内存基本构件new/delete的意义、运用方式以及重载方式
记录了从new / delete到operate_new / operator delete再到malloc / free的代码流程。记录了new / delete编译器角度的理解。记录了operate_new / operator delete源代码。.记录了为什么不能直接使用构造函数的原因。原创 2020-12-24 20:03:01 · 381 阅读 · 3 评论 -
C++ 内存分配层次以及memory primitives的基本用法
内存分配层次以及memory primitives的基本用法原创 2020-12-24 16:28:28 · 312 阅读 · 0 评论