/****************************************************************/
/* 学习是合作和分享式的!
/* Author:Atlas Email:[email protected]
/* 转载请注明本文出处:
* http://blog.csdn.net/wdzxl198/article/details/9059883
/****************************************************************/
上节内容回顾:传送门
1.C++内存管理 1.1c语言和C++内存分配 1.2区分堆、栈、静态存储区 |
1.3控制C++的内存分配
在C++中一种常见的问题是对内存的分配,重点是new和delete的使用不当而失控。一般来说,C++对内存的管理非常的容易和安全,当一个对象被消除时,它的析构函数能够安全的释放所分配的内存。所以频繁的使用new和delete动态分配会出现一些问题和堆破碎的风险。
所以,当你必须要使用new 和delete时,你不得不控制C++中的内存分配。你需要用一个全局的new 和delete来代替系统的内存分配符,并且一个类一个类的重载new 和delete。
一个防止堆破碎的通用方法是从不同固定大小的内存池中分配不同类型的对象。对每个类重载new和delete就提供了这样的控制。
小问:为什么需要重载operator::new和operator::delete? 虽然C++标准库已经为我们提供了new与delete操作符的标准实现,但是由于缺乏对具体对象的具体分析,系统默认提供的分配器在时间和空间两方面都存在着一些问题:分配器速度较慢,而且在分配小型对象时空间浪费比较严重,特别是在一些对效率或内存有较大限制的特殊应用中。比如说在嵌入式的系统中,由于内存限制,频繁地进行不定大小的内存动态分配很可能会引起严重问题,甚至出现堆破碎的风险;再比如在游戏设计中,效率绝对是一个必须要考虑的问题,而标准new与delete操作符的实现却存在着天生的效率缺陷。此时,我们可以求助于new与delete操作符的重载,它们给程序带来更灵活的内存分配控制。除了改善效率,重载new与delete还可能存在以下几点原因: a)检测代码中的内存错误。 b)性能优化 b)获得内存使用的统计数据。 注意:C++中new和delete操作符不可以重载,但是在operator::new可以被重载,这个操作只是用来申请内存,不调用构造初始化对象!切记,如果需要详细阅读,请查看相关文档。 在《Effective c++》一书中也有讲解为什么需要重载,似乎重载是必须的?对于何种情况下需要重载new和delete的问题,以及如何重载的问题,需要继续研究学习。 |
详见文章-建议33:小心翼翼地重载operator new/ operator delete |
(1)重载全局的new和delete
以下代码为《c++内存管理技术内幕》中是的,只限于简单原理学习
1: void * operator new(size_t size)
2: {
3: void *p = malloc(size);
4: return (p);
5: }