举个栗子:Complex* pc = new Complex(1, 2); 此处new称为表达式或运算符new,编译器将其转化为一下代码:
Complex* pc;
try
{
void* mem = operator new(sizeof(Complex)); // 底层调用malloc函数分配内存
pc = static_cast<Complex*>(mem);
pc->Complex::Complex(1, 2); // 一般由分配器的construct函数完成,主要工作:
// 使用placement new: new(mem)(arguments_list)
// 即:pc = new(mem)(1,2)完成初始化
// 相应的析构对象时调用分配器的destroy函数,释放内
// 存则调用operator delete
} catch( std::bad_alloc )
{
// 处理可能出现的异常
}
也就是创建新对象时,new做了两件事:分配内存、调用构造函数
深入探索C++对象模型,第45页。 class X定义了一个拷贝构造函数,一个虚析构函数,一个虚函数foo();
X foobar()
{
X xx;
X *px = new X;
xx.foo();
px->foo();
delete px;
return x;
}
这个函数可能在内部转换为//虚拟C++码
void foobar(X& _result)
{
//使用引用返回,属于编译器的优化了。
//构造
_result.X::X();
//申请内存
px = _new(sizeof(X));
//调用构造函数
if( px != 0)
px->X::X();
//成员函数的形式的转换,成员函数就是普通函数不过有一个this指针
foo(&_result);
//虚函数的基本调用方式,通过vptr来调用
(*px->vtbl[2])(px);
//调用虚析构函数
if( px != 0)
{
(*px->vtbl[1])(px);
_delete(px);
}
//不需要使用named return statement
//不需要摧毁Local object xx
//而是使用了传入参数_result
return;
}