本文共 1194 字,大约阅读时间需要 3 分钟。
举个栗子:Complex* pc = new Complex(1, 2); 此处new称为表达式或运算符new,编译器将其转化为一下代码:
Complex* pc;try{ void* mem = operator new(sizeof(Complex)); // 底层调用malloc函数分配内存 pc = static_cast(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;}
转载地址:http://taxdi.baihongyu.com/