C++中有了malloc/free,为什么还需要new/delete?

在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[]要配套使用!


猜你喜欢

转载自blog.csdn.net/weixin_38885154/article/details/80186186