【C++知识】浅谈关于C++的内存管理
浅谈关于C++的内存管理
目录
1、内存管理的预备工具
malloc/free函数
void* p1=malloc(512); //分配512个字节 free(p1);
对于malloc,它进行分配的内存块,除了需要申请的必要内存空间外,上下各有一个cookie,一共占8个字节,用来记录当前内存块的大小,而整个内存块的大小应该是16的倍数,所以可能还会额外增添一些其他内存空间,所以整个下来,当需要多次申请内存时,就会造成大量的内存空间浪费。
new/delete表达式
complex<int>* p2=new complex<int>; delete p2;
new:实际上分为三个步骤:1)分配内存,调用operator new函数,而operator new函数实际上就是调用malloc分配内存;2)类型转换,对于分配内存后返回的变量进行转换成指针类型,因为new需要返回一个指针类型;3)自动调用构造函数。
delete:1)自动调用析构函数;2)释放内存,调用operator delete函数,而operator delete函数实际上就是调用free来释放内存。
注:构造函数不能被直接调用,但析构函数可以直接调用。
array new/array delete
delete []:会调用多次析构函数
注:若没加 [ ] 实际上不一定会造成内存泄漏,这样只是只调用了一次析构函数,对于类中数据类型没有指针的,则不会造成内存泄漏,即没有在堆上分配内存。
placement new
可以间接地去直接调用构造函数,允许我们将object构建于已分配内存中。
写法:new (指针) 定点分配内存,即在已分配内存好的地方再次分配内存
实际步骤:1)调用operator new(size_t,buf)函数,不过这里面没做任何操作,不分配内存;2)调用构造函数。
allocator分配器
一般用于容器,因为分配器用于每次分配内存大小较为固定,而容器每次存储的大小都是固定的,所以在底层用于内存管理的就是分配器。不过实际中也是malloc和free进行对内存直接处理。
2、内存管理
对于内存管理,我们需要达到两个目的,即提高速率,降低浪费空间。提高速率:即减少调用malloc次数,我们可以采取一次性分配一个比较大的内存空间,然后进行分块利用。
这也是嵌入式指针方法。这样会减少大量的cookie空间。
对于new和delete表达式,我们不能做什么修改,但我们知道了里面实际上是在调用operator new和operator delete函数,所以我们可以对此进行重载,在里面进行处理。对于delete,就是把回收的指针放到单向链表的头。
性能最好的一个内存管理示意图如下:(G2.9下非标准的一个分配器原理_gnu_cxx::pool_alloc)
上一篇: 谈谈Swift中的枚举内存布局