1. 程式人生 > >new函式的底層實現

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; }