现在位置: 首页 > 内存管理
2020-04-13 10:49 工业·编程 ⁄ 共 33174字 暂无评论
C++的高抽象层次,又兼具高性能,是其他语言所无法替代的,C++标准保持稳定发展,更加现代化,更加强大,更加易用,熟练的 C++ 工程师自然也获得了“高水平、高薪资”的名声,但在各种活跃编程语言中,C++门槛依然很高,尤其C++的内存问题(内存泄露,内存溢出,内存宕机,堆栈破坏等问题),需要理解C++标准对象模型,C++标准库,标准C库,操作系统等内存设计,才能更加深入理解C++内存管理,这是跨越C++三座大山之一,我们必须...
阅读全文
C语言标准就是这么规定的:free无需手动指示大小。不是怕你不小心填错,而是事实上你很难填对。 这是因为,虽然你告诉了malloc你要多少空间,但malloc真正分配了多少只有它自己知道。例如,你向malloc要了999字节,但某人写的malloc分配的最小粒度是1024字节,那么你会得到一个1024字节的空间(虽然你一直以为它是999字节而不敢越雷池一步,这倒也没什么)。 所以,要是你填一个错误值,还得让它费心修正,还不如就让它自己管理...
阅读全文
2019-12-26 18:43 工业·编程 ⁄ 共 5825字 暂无评论
一、STL中的内存管理 当我们new一个对象时,实际做了两件事情:(1)使用malloc申请了一块内存。(2)执行构造函数。在SGI中,这两步独立出了两个函数:allocate申请内存,construct调用构造函数。 这两个函数分别在<stl_alloc.h>和<stl_construct.h>中。 二、第一级配置器 第一级配置器以malloc(),free(),realloc()等C函数执行实际的内存配置、释放、重新配置等操作,并且能在内存需求不被满足的时候,调用一个...
阅读全文
2019-12-25 18:28 工业·编程 ⁄ 共 3534字 暂无评论
malloc/calloc/free是库函数,在底层使用系统调用进行内存申请,自己添加了中间层进行管理,brk,sbrk,mmap,munmap是系统调用。申请的是虚存。   mmap 映射匿名页, 当发生缺页异常时, linux 内核为缺页分配一个新物理页,并将该物理页清 0。   对空闲的小内存块只会在 malloc 和 free 的时候进行合并。   主分配区与非主分配区用环形链表进行管理。 每一个分配区利用互斥锁( mutex)使线程对于该分配区的访...
阅读全文
2019-12-24 18:19 工业·编程 ⁄ 共 1365字 暂无评论
STL中的内存管理为两级配置器,一级配置器是当申请内存大于128B时候使用系统函数malloc/free进行申请释放。 二级配置器,将内存块分为大小间距为8的16个8B到128B的等长度的chunk,使用数组+链表管理。数组中存储的是大小相同的用链表链接起来的内存块。在STL中使用长度为16的数组,0处存储8Byte,然后依次16,24,36.....依次加8字节。二级配置器维护着一个内存池,如果所申请的内存块对应的数组的链表下为空,就向池中申请,如...
阅读全文
2019-12-22 18:05 工业·编程 ⁄ 共 6597字 暂无评论
在上篇博文中,我们系统地学习了Boost库中智能指针的学习,在处理单个对象时,采用智能指针是一个很不错的选择,但是当需要管理的对象不止一个时,这时候智能指针就有点无能为力了,今天我们就来看看Boost库中pool库的一些东西,Boost.pool库是基于简单分隔存储思想实现的一个快速、紧凑的内存池库,不仅能够管理大量的对象,而且还可以作为stl的内存分配器,在需要大量地分配和释放小对象时,很有效率,且完全不用考虑delete,...
阅读全文
2019-12-21 17:37 工业·编程 ⁄ 共 11671字 评论 1 条
说起内存管理,大多数人第一反应就是new,delete等操作,这一类操作所针对的对象就是堆对象,在使用这一类操作时,一个很突出的问题就是内存泄露,这也是每个C++程序猿的挥之不去的噩梦,曾几何时因为一个不起眼的指针释放问题,而导致了服务器因内存写满而宕机,而如今这类问题,对于C++程序开发者而言已经不再是问题了,为了解决这个问题,C++程序员采用了RAII机制(资源获取即初始化),具体思想就是:在对象初始化时分配资...
阅读全文
2019-12-20 17:28 工业·编程 ⁄ 共 710字 暂无评论
boost主要是通过六种智能指针来管理内存的:scoped_ptr scoped_array shared_ptr shared_array weak_ptr intrusive_ptr。他们都是轻量级的对象,速度与原始指针相差无几,对于所指的类型T也仅有一个很小且很合理的要求:类型T的析构函数不能抛出异常。 scoped_ptr:仅仅提供了*和->操作,且赋值操作符和拷贝构造函数被定义为私有的,有效的防止了指针所有权的转让。 ==和!=操作符被私有化,拒绝比较操作。 scoped_array:包装...
阅读全文
1. RAII机制 为了管理内存等资源,C++程序员通常采用RAII机制(资源获取即初始化,Resource Acquisition Is Initialization),在使用资源的类的构造函数中申请资源,然后使用,最后在析构函数中释放资源。 1)在栈上创建对象(局部对象):RAII机制正常工作,当离开作用域时,对象会自动销毁从而调用析构函数释放资源 2)在堆上创建对象,使用new操作符,那么它的析构函数不会自动调用,只有对应的delete操作符销毁它才能释放...
阅读全文
2019-12-18 17:12 工业·编程 ⁄ 共 481字 暂无评论
1 简要介绍 Boost的内存管理库,包含两部分内容,分别是smart_ptr库和pool库,其中我们熟知的shared_ptr、unique_ptr、weak_ptr早已在2011年引入C++11标准。 1)smart_ptr库包含scoped_ptr、unique_ptr、shared_ptr、weak_ptr、intrusive_ptr 2)pool库包含pool、object_pool、singleton_pool smart_ptr库有什么作用? 1)里面包含我们熟知的shared_ptr、unique_ptr、weak_ptr 2)scoped_ptr和unique_ptr功能类似,但是它更精小...
阅读全文