new 是一個運算子,是在編譯的時候可以確定資料類型, 所以,new需要關心操作對象的資料類型,調用該類型的初始化函數。
malloc()是一個函數,是在啟動並執行時候起作用, malloc()函數只關心記憶體大小參數,至於這個記憶體放置什麼資料結構,malloc()不關心.
由於new 和 malloc() 的特性,決定了在對象初始化方面的不同用處.
在more effective c++中,想必大家看到過這樣的說法,operator new() 和 new operator 不是一個概念,
operator new() 是函數調用, 可以被重載, 它的完整形式是 void * operator new(size_t cb);
new operator 字面意思說啊,這個new是一個運算子。由c++編譯器來解釋它的豐富含義,實際上,它的豐富含義就是: 調用前面的 void * operator new(size_t cb)來分配一個空間,再用返回的這個指標值作為參數來調用對象的建構函式,使用__thiscall呼叫慣例, this的值就是這個地址指標,通過ecx來傳遞的(vc++編譯器)。
你可以重載void * operator new (size_t cb); 你設定可以給特定的類定義各自的記憶體配置函數void * operator new (size_t cb);
比如說:
class Sample<br />{<br />public:<br />Sample(){};<br />virtual ~Sample(){};</p><p>public:<br />void * operator new(size_t cb){};<br />};<br />void test(void)<br />{<br />Sample * ps = new Sample(); // use void * Sample::operator new() to alloc space, not the global one.<br />}
另外還有一種叫做 replacement new, 就是程式自己來分配一個空間(比如說在棧上),然後將這個指標交給 replacement new 來調用建構函式,進而進行對象初始化。使用方式:
char _space_on_stack [0x200] = {0};<br />Sample * _ps = new(_space_on_stack) Sample(); // 不要隨便釋放啊。