当我们用 new 去动态分配内存时:
complex *pc = new complex(1, 2);
编译器会为我们转为如下实现:
complex *pc;
try
{
void *mem = operator new(sizeof(complex)); //allocate
pc = static_cast<complex*>(mem); //cast
pc->complex::complex(1, 2); //construct
}
catch(std::bad_alloc)
{
//...
}
也就是说,利用 new 去动态分配内存时,背后会做如下动作:
- 调用 operator new 去分配内存,operator new 底层调用的 malloc 函数。operator new 可以使用全局的 ::operator new 或者自己重载
- 将获得的 void * 指针转型成为所需类型的指针
- 调用所需类型的构造函数
当用 delete 释放内存时,则先调用对象的析构函数,然后调用 operator delete 释放内存。