动态内存管理(C++)

动态内存管理(C++)

在C语言中我们为了解决部分问题从而选择在堆上开空间,从而有了动态内存管理,故名思意,动态内存管理就是我们自己向内存申请空间自己释放,在C语言中我们用malloc calloc realloc free这几个函数来向堆上开辟释放空间,但是在C++中由于有类的关系所以与C的申请方式不一样,这一篇博客我们来看一看C++中的动态内存管理。

new与delete

在C++中我们申请空间已经不是通过函数了,而是通过关键字,C++中有new与delete为我们管理动态内存。
new的意思是向内存中申请空间并且完成初始化,用法与malloc类似

int* p1=new int(3);
int* p2=new int[3];

第一句表示向堆中申请int类型并且初始化为3,返回一个指针指向申请的空间
第二句表示向堆中申请三个int类型的空间并且返回指向该地址的指针
从上边我们可以看到,这里new做了两件事情,向堆中申请了空间,并且完成了初始化。
delete的用法很简单,我们释放空间的时候直接delete加指针即可。

delete p1;
delete[] p2;

这里要记得,new/delete,new[ ]/delete[ ] malloc/free这三组一定要配套使用,不然会发生内存泄露。

静态变量

静态变量与动态变量不同,动态变量我们要向堆中申请空间,我们可以自己把控并且存在堆上,静态变量用关键字static修饰,存在于代码段,一般为全局变量。并且我们不能主宰这里的地址申请与释放。

既然我们都知道C里边有很好用的函数来控制内存开辟,那为什么C++中还要有关键字来重新使用一种新的方式开辟空间呢
因为C++中多了自己定义的类,我们不确定类的大小并且由于构造函数与析构函数的存在,使用malloc很不方便,然而new由于封装了一层就可以解决这个问题,delete同时也解决了析构函数的问题。

new/delete与malloc/free区别与联系

  1. 它们都是动态管理内存的入口。
  2. malloc/free是C/C++标准库的函数,new/delete是C++操作符。
  3. malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理 成员)。
  4. malloc/free需要手动计算类型大小且返回值会void*,new/delete可自己计算类型的大小,返回对应类型的指针。

operator new与operator delete

很多人看见这两个函数肯定以为是函数重载,然而只是巧合,这两个函数与重载没有任何关系
这两个函数是标准库函数,作用与malloc与free美誉任何区别,都是向堆上开空间,释放空间,不进行初始化,不进行清理对象。
事实上我们刚刚分析可知new与delete做了两件事,开空间,初始化,释放空间,销毁对象,后面一件事是由于类有构造函数与析构函数所以将new与delete进行封装,我们可以理解为封装下new调用operator new进行开空间,delete调用operator delete释放空间。

猜你喜欢

转载自blog.csdn.net/qq9116136/article/details/80818949
今日推荐