一 .在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 等内置类型,析构函数是可调和可不调的,所以编译器会选择不调用它。最重要的一点就是要明白,它们的工作过程,我们才能更好的去使用它们。