在C++编程中,我们经常会使用到new和delete来进行动态申请和释放内存,但你想过下面的问题吗?
- new和delete是函数吗?
- new[]和delete[]是什么,什么时候用它们?
- 你知道operator new和operator delete吗?
- 为什么new[]出来的数组有时可以用delete释放,有时不行?
new和delete到底是什么?
首先,我们要知道malloc/free是C++/C语言的标准库函数,而new/delete则与sizeof类似,并不是函数,它们都是C++中定义的关键字(运算符)。我们回绝的new不就和malloc函数一样吗,就是用来动态申请空间的,但看下面的语句,你就会看出,new和malloc还是有一些不同的。
string *ps=new string("hello word");
malloc申请完空间之后不会对内存进行必要的初始化,而new可以。所以在我们了解new背后的机制之前,我们有必要先了解 operator new和operator delete是什么?
operator new和operator delete
这两个其实是C++标准库函数,原型如下:
void *operator new(size_t); //allocate an object
void *operator delete(void *); //free an object
void *operator new[](size_t); //allocate an array
void *operator delete[](void *); //free an array
在这里operator并不是重载new和delete,因为new和delete是不允许重载的。我们要理解,这两个函数和c语言中我们常用的malloc和free有点像都是申请和释放内存的,并且operator new申请内存之后不对内存进行初始化,而是直接但会申请内存的指针。
new和delete机制
在一次new操作中,大致完成以下三个步骤:
1,调用operator new函数,分配足够大的原始的未类型化的内存,
2,运行该类型相应的构造函数,在上一步分配的内存基础上进行初始化对象
3,返回新分配并指向构造的对象的指针
而delete的使用中,主要进行两件事
1,对指针所指向的对象运行析构函数
2,调用operator delete函数,释放该对象所用的内存
C++中有了malloc/free,为什么还需要new/delete?
1,malloc/free是C++/C语言的标准库函数,new/delete是C++运算符,
它们都可进行动态内存和释放内存。
2对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求
由于malloc/free是库函数不是运算符,不在编译器的权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free.
3,C++需要一个能完成动态内存分配和初始化工作的运算符new,一个能完成清理与释放工作的运算符delete。
最后要记住很重要的一点 new/delete,new[]/delete[]要配套使用!