在看C++动态内存管理之前,先来看看C语言的动态内存管理:
C语言中进行动态内存申请使用的是库函数(malloc/realloc/calloc),申请出来的空间在堆上,用完之后使用free()函数进行回收,防止内存泄漏。
C语言中有一套动态内存的方法,那么C++中为什么还要有一套动态内存管理的方法呢?
因为C++是面向对象的,那么C语言中的内存申请方法能否为C++中的对象申请空间呢?小编通过调试发现:可以将空间申请下来,但是没有调用构造函数,就可以认为如果使用malloc进行空间申请,则会申请下来一段与对象大小相同的一块空间,但是没有调用构造函数进行初始化,不能称为对象。
因此C++中有自己一套动态内存管理方法:
申请单个类型的空间:new;释放单个类型的空间:delete;
申请一段连续的空间:new[];释放单个类型一段连续的空间:delete[];
Test* T = new Test;
delete T;
Test* T2 = new Test[5];
delete[] T2;
然后看看new 和delete的实现原理:
通过查看发现在使用new申请空间时会调用一个operator new()函数:
那么new执行过程:
(1)申请内存空间:调用operator new(size_t size)申请空间,通过查看该函数实现方式发现该函数直接使用malloc申请空间,申请成功直接返回。
(2)调用构造函数对申请空间进行初始化。
同样方法delete执行过程:
(1)调用对应类型的析构函数,清理对象中的资源。
(2)调用operator delete(void *p)释放空间,还是通过free(p)的方式进行回收。
以上就是C++的动态内存管理方式。