new & malloc()

來源:互聯網
上載者:User

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(); // 不要隨便釋放啊。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.