C++内存管理笔记(一)
2024-09-06 01:03:43
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() 还有第二个参数 : 默认为不报错,如若要报错可以自己指定。
最新文章
- Window 端口查询
- Java并发之CyclicBarrier 可重用同步工具类
- [Monitor] 监控规则定义
- 关于google电子地图跟卫星地图位置不重合
- Apache是目前应用最广的Web服务器,PHP3是一种类似ASP的脚本语言
- 制作UI纹理(UI Texture)
- Java 异常解决之java.lang.IllegalArgumentException: Comparison method violates its general contract!
- HDU 5741 Helter Skelter
- DALI解码模块
- 【Unity Shaders】ShadowGun系列之二——雾和体积光
- struts2框架搭建学习遇到的问题
- C# 开源组件--NPOI读取Excel单元格中的公式值
- redis 系列7 数据结构之跳跃表
- CSS盒子模型 box-sizing 用法
- 【转】如何用Redis做LRU-Cache
- Java基础-虚拟内存之映射字节缓冲区(MappedByteBuffer)
- 从数据库中取 datetime类型,界面展示 yyyy-MM-dd
- 【剑指offer】斐波那契数列
- QT-This application failed to start because it could not find or load the Qt platform plugin ";windows";
- 作业:WordCount--实现字符数,单词数,行数的统计