可以通过重载operator new()/operator delete()、operator new[] ()/operator delete[] ()接管内存分配,一般重载为类的静态(对象还没有创建)函数,而不会重载为全局函数,因为把控不了,风险太大。
Complex* pc=new Complex(1,2);实现可能有两种情况:
a、1/3/2先分配内存,再调用构造去初始化这块内存,最后将m_instance指针指向这块内存(编译器优化情况)。
b、1/2/3先分配内存,再将m_instance指针指向这这段内存,最后调用构造去初始化这块内存。
可以通过set_new_handler设置处理异常的函数指针。
int* ip=new int[10];与Demo* p=new Demo[3];一般类型(int/double等)与自定义类在堆中数组内存布局不同。
new()/delete()、new[] /delete[]成对匹配使用,智能指针最好用其工厂函数(std::make_shared())创建。
上下cookie+debug的内存+用户获取到的内存+pad(用于16字节对齐),并借用了一字节用来做是否给出的标记
指针,32位系统指针大小为4字节,64位为8字节。此处利用union设计了一个嵌入式指针,此方法非常经典。
简化写法,需要内存池的该类的堆内存管理,在类中写入该macro即可。
打印其创建出来的元素地址值会出现连续的情况
VC中的allocator中没有任何特殊设计,辗转还是调用malloc,malloc
STL中的6个typedef,模板编程用于类型萃取。
5种iterator_category,继承关系的struct,而不是枚举,算法和仿函数通过iterator_traits获取其类型,通过模板特化或者片特化实现实现重载。从而得到容器的内存分布特点,根据不同的内存分布重载调用更优的算法。
山穷水尽后的处理,没有尝试将系统剩余内存,是否满足索取量不断折半的要求,会导致其他app没有内存可用,也并未回收16根链表挂载的区块。
总结:为什么要用内存管理?
1、减少内存碎片,对其进行管理。
2、减少cookie提高利用率。
3、减少对malloc和free调用次数,提高效率。
4、用户态切和内核态的切换
内存管理及内存池实现
侯捷C++内存管理课件
SGI-STL(version3.3)
如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810