new函数的底层实现

举个栗子: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;
}

猜你喜欢

转载自blog.csdn.net/seamanj/article/details/81019920