C++内存分配的四个层面 :

  

  四个层面的比较:

  

  内存分配与释放的测试:

    );    //512 bytes
    free(p1);

    complex<int>* p2 = new complex<int>; //one object
    delete p2;             

    ); //512 bytes
    ::operator delete(p3);

//以下使用 C++ 标准库提供的 allocators。
//其接口虽有标准规格,但实现商业并未完全遵守;下面三者形式略同。
#ifdef _MSC_VER
    //以下兩函數都是 non-static,定要通過 object 調用。以下分配 3 個 ints.
    , ();
    allocator<);
#endif
#ifdef __BORLANDC__
    //以下兩函數都是 non-static,定要通過 object 調用。以下分配 5 個 ints.
    );
    allocator<);
#endif
#ifdef __GNUC__
    //以下兩函數都是 static,可通過全名調用之。以下分配 512 bytes.
    //void* p4 = alloc::allocate(512);
    //alloc::deallocate(p4,512);   

    //以下兩函數都是 non-static,定要通過 object 調用。以下分配 7 個 ints.
    );
    allocator<);     

    //以下兩函數都是 non-static,定要通過 object 調用。以下分配 9 個 ints.
    );
    __gnu_cxx::__pool_alloc<);
#endif

  new关键字的实现:

    首先new是被编译器编译成三步:

    Com * p = new Com(1,2);

    等价于 :

    void * mem = ::operator new(sizeof(Com)); // 内存分配

    p = static_cast<Com*>(mem);         // 强制类型转换

    p->Com::Com(1,2);               // 构造函数调用(自己这么写在大部分编译器上不支持,但是实际上只是编译器的实现阻止了这么写)

  我们可以知道 new分配内存 是通过 operator new() 函数实现的。

  而 operator new() 的函数实现实际上是依靠 malloc 实现的,如下图 :

  

  operator new() 不断地循环调用 malloc(),如若分配内存不成功的话。

  但实际上还有另一个操作就是调用 _callnewh(size), 这个函数可以由我们重写。

  当malloc也分配不出内存时,就会调用它,我们可以将其重写为 : 释放部分我们认为可以释放的内存,然后下次malloc就能分配到内存了。

  而 operator new() 还有第二个参数 : 默认为不报错,如若要报错可以自己指定。

最新文章

  1. Window 端口查询
  2. Java并发之CyclicBarrier 可重用同步工具类
  3. [Monitor] 监控规则定义
  4. 关于google电子地图跟卫星地图位置不重合
  5. Apache是目前应用最广的Web服务器,PHP3是一种类似ASP的脚本语言
  6. 制作UI纹理(UI Texture)
  7. Java 异常解决之java.lang.IllegalArgumentException: Comparison method violates its general contract!
  8. HDU 5741 Helter Skelter
  9. DALI解码模块
  10. 【Unity Shaders】ShadowGun系列之二——雾和体积光
  11. struts2框架搭建学习遇到的问题
  12. C# 开源组件--NPOI读取Excel单元格中的公式值
  13. redis 系列7 数据结构之跳跃表
  14. CSS盒子模型 box-sizing 用法
  15. 【转】如何用Redis做LRU-Cache
  16. Java基础-虚拟内存之映射字节缓冲区(MappedByteBuffer)
  17. 从数据库中取 datetime类型,界面展示 yyyy-MM-dd
  18. 【剑指offer】斐波那契数列
  19. QT-This application failed to start because it could not find or load the Qt platform plugin &quot;windows&quot;
  20. 作业:WordCount--实现字符数,单词数,行数的统计

热门文章

  1. 登录密码忘记修改jenkins
  2. [工具] Git版本管理(三)(工作流)
  3. Mysql库、表、记录的基本操作
  4. 【题解】HDU Homework(倍增)
  5. 使用宝塔搭建nextcloud的过程(搭建、优化、问题)
  6. background,position,绝对定位中位置属性的定位规则,cursor
  7. Java工作流系统-父子流程的配置讲解
  8. Okhttp解析—Okhttp概览
  9. FIND_IN_SET 精确查找
  10. realme X2谷歌套件