new函式的底層實現
阿新 • • 發佈:2019-02-08
舉個栗子: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;
}