欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C++知识】浅谈关于C++的内存管理

程序员文章站 2022-04-11 17:07:34
...

浅谈关于C++的内存管理

目录

浅谈关于C++的内存管理

1、内存管理的预备工具

malloc/free函数

new/delete表达式

array new/array delete

placement new

allocator分配器

2、内存管理

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次数,我们可以采取一次性分配一个比较大的内存空间,然后进行分块利用。

【C++知识】浅谈关于C++的内存管理

 这也是嵌入式指针方法。这样会减少大量的cookie空间。

       对于new和delete表达式,我们不能做什么修改,但我们知道了里面实际上是在调用operator new和operator delete函数,所以我们可以对此进行重载,在里面进行处理。对于delete,就是把回收的指针放到单向链表的头。

性能最好的一个内存管理示意图如下:(G2.9下非标准的一个分配器原理_gnu_cxx::pool_alloc)

【C++知识】浅谈关于C++的内存管理

相关标签: C++