new和delete是关键字运算符不是函数
new做了两件事,分配内存(调用operator new()函数来分配内存),调用构造函数
delete做了两件事,调用析构函数,释放内存(调用operator delete()函数来释放内存)
为什么delete知道new分配了多少内存需要释放呢,因为new内部有记录机制,会将分配的内存大小额外在一个区域记录下来,delete通过读取这个区域就知道需要释放多少内存
当定义了一个占1个字节的类A时,使用A *a = new A[4]时,若最后不delete,结果发现泄露了8个字节,为什么不是4个字节呢,因为对于类类型,每次动态分配内存数组时,需要额外4个字节来存储分配对象的个数,这样便于delete[]来调用多个析构函数。
对于普通的内置类型,int *temp = new int[5] 来说,因为不需要调用析构函数,所以delete和delete[]效果一样。但是类对象数组就一定需要delete[]
如果一个类中无自定义的析构函数,那么编译器就不会额外为它分配4个字节来存储分配对象个数,调用无中括号的delete也不会出错,因为无需调用析构函数。
所以有那四个字节才能用delete[],没有的时候只能用delete。