C++之new And delete

一 .在C++中new是用来开辟空间的,delete是用来释放所开辟的空间的。

下面,我们来看一下new是怎样去开辟空间的,首先,new是一个运算符,当我们执行到new aa,时,编译器会自动调用opertor new(),然后operator new()函数会调用malloc()去给对象分配空间,如果分配失败,则会抛出一个异常,(面向对象出错时会抛出一个异常)若成功,则返回创建对象的首地址。最后空间申请成功后,然后调用构造函数去初始化所申请的这块内存。

那delete是怎样去释放空间的呢?

和new运算符是相反的,当执行到delete aa时,编译器会调用匹配的析构函数去清理我们的内存空间,即将我们内存空间中的内容清理了,然后,再去调用operator delete()函数,operator delete()会调用malloc()函数去释放我们所开辟的空间。

好了,以上就是new和delete运算符的实现原理了。

二.  new 和 delete运算符的使用

new aa;

delete aa;

new aa[10];

delete[] aa;

下面,在来说一下,以上两个运算符的工作过程

第一个就比较简单了,是和我上面所说的实现过程是一样的。关键点是第二个,第二个是分配了10个对象,分配时是new aa[10],释放时是delete[] aa;可以看到,分配时,我们明确指出了,分配10个对象大小的空间,但释放时,我们却没有指定释放多少个对象,那编译器是怎么知道要释放这么多的对象的呢?哈哈,当然是编译器偷偷给它分配了啊,编译器会分配内存来保存对象的个数,保存在我们所分配对象的首地址中。这样我们就知道该释放多少个对象所占用的内存空间啦。

我们通常都会说,new和delete是要匹配使用的,但其实不是,只要我们知道了new 和delete运算符的工作原理,我们就可以灵活的去使用这两个运算符啦。

下面看:int* p1=(int*)malloc(sizeof(aa))

              delete aa;

             可以这样去释放而不是用free去释放吗?这可以的,只要析构函数不去做清理工作就可以了,delete与free是前者在释放前要做清理工作,(而free 是不需要的。那就是只要构造函数不做清理工作时,我们是可以调用delete去释放的。

malloc 与free是和delete与new其实是可以不匹配使用的,只要我们掌握了new和delete运算符的工作原理,我们就可以很灵活的去使用它们了。

new->operator new()->malloc()->构造函数初始化。

delete->析构函数清理->operator delete()->free() 。

这就是它们的工作过程。

像int ,double 等内置类型,析构函数是可调和可不调的,所以编译器会选择不调用它。最重要的一点就是要明白,它们的工作过程,我们才能更好的去使用它们。



猜你喜欢

转载自blog.csdn.net/weixin_40797414/article/details/80891280
今日推荐