C++内存管理

  • primitives(基本工具)

    • 对比

      • malloc,free

        • 不可重载

        • c函数

      • new,delete

        • 不可重载

        • C++表达式

      • ::operator new(),::operator delete()

        • 可重载

        • C++函数

      • allocator<T>::allocate(),allocator<T>::deallocate()

        • 可自由设计并以之搭配任何容器

        • C++标准库

    • new

      • 1.operator new(sizeof())

      • 2.构造函数,注:自己使用时不能直接调用构造函数

    • delete

      • 1.析构函数

      • 2.operator delete(pc)

    • array new,array delete

      • new []

      • delete []

        • 不加[]的影响

          • 1.class内不带指针可能没影响

          • 2.class内带指针会内存泄露

    • placement new

      • new(p)Complex(1,2)

        • 1operator new(sizeof(Complex),p):不分配内存

        • 2构造函数

    • 重载

      • 类外::oprator new/delete

      • 类内oparator new/delete(本质是静态的)

    • Per-class allocator

      • 重载类内oparator new/delete

      • operator new:内存池,每个单独的类内会多一根指针,链表

      • operator delete:将回收的内存加到自由链表的前端

    • static allocator

      • 把内存分配的过程写到一个allocator类中,通用

    • macro for static allocator

      • static allocator 的宏版本

    • new handler

      • typedef void(*new_handler)()

      • new_handler set_new_handler(new_handler p) throw();

        • 没有内存能被分配,不断调用

  • std::allocator

    • G2.9 std::alloc 运行模式

    • 128bytes以内

      • free_list[16]:16条自由链表,第一条8字节开始,以后每条上的块多8字节,第n条,n=申请大小/8-1;

      • 开辟内存时,内存池不够时,开辟20*该条链表上块大小+20*该条链表上块大小(内存池)+(RoundUp(累计量>>4)),有剩余时,从内存池,最多切20个(即使内存池容量充足)

      • 申请时,内存池剩余连一块也满足不了,为碎片,先将其挂在大小符合的自由链表下,再开辟内存

      • 当内存池不足,同时系统内存也不足时,alloc从手中资源最接近申请大小的自由链表中取出一块回填pool

      • 一条链表上的一块,包含union,嵌入式指针,4个字节

    • 大于128bytes

      • 直接malloc

>>>>>>>(侯捷版笔记)

posted @   肆空界  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示