关于new和delete

1 new的过程

先分配memory,再调用ctor(构造函数)

Complex* pc = new Complex(1, 2);
//编译器转化为:

Complex *pc;
void* mem = operator new( sizeof (Complex) );//operator new内部调用malloc
pc = static_cast<Complex*>(mem);
pc->Comlex::Complex(1, 2);
qfEkG9.png

2 delete过程

先调用析构,再释放内存

Complex* pc =  new Complex(1, 2);
...
delete pc;

//编译器转化为:
Complex::~Complex(pc); //析构函数
operator delete(pc); //释放内存,内部是调用free(pc)
qfEer6.png

3 new和delete,new数组和delete [] p

new数组要搭配delete [] p使用,因为一个delete调用一次析构,如果不用[]会导致另外几个对象的成员变量没有释放,造成内存泄露;虽然complex可以不用,但是还是得养成好习惯

String* p = new String[3];
....
delete p;//只调用了一次析构,另外两个的char* 成员就没有释放掉,造成内存泄露
//应该是
delete [] p;