2009-11-13 105 views
3

我玩的動態內存分配「手動」,我想看看如何放置新的被人從MS實現,但是當我調試「步入」它讓我感動代碼:魔術放置新?

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0() 
{ // construct array with placement at _Where 
return (_Where); 
} 
莫非

任何人都會向我解釋,當我在這段代碼中看到的所有內容都與return語句一致時,這個代碼將我的對象放在指針指向的地方。我不認爲在評論中說我希望這個fnc做的事實際上足以讓它工作。 謝謝你的建設性答案。

回答

13

operator new的目的只是爲對象分配內存,並返回指向該內存的指針。當你使用placement new時,你基本上告訴編譯器「我知道這個內存很好,跳過分配,並且使用這個指針作爲我的對象。」然後使用由operator new提供的指針調用對象的構造函數,而不管它是剛剛分配的內存還是使用放置新位置指定的內存。 operator new本身對你的對象的構造沒有任何影響。

+0

這意味着你最好注意,有足夠的地方來容納'size_t'通過,否則你會遇到麻煩...... – 2009-11-14 19:54:27

5

請記住,new T(...)(稱爲「新表達式」)所做的是兩件事:分配內存和初始化對象。你可以通過編寫構造函數來調整初始化。對於你寫的分配operator new。所以,儘管名稱,operator new只做一個新表達式的一方。

放置新位置是爲了將對象放入預先分配的內存中。您不能直接調用構造函數,將預分配的內存作爲this指針傳遞。你可以做的唯一的事情就是使用新的佈局:這將分配轉換爲空操作,只留下構造。這

inline void* operator new(size_t, void *p) throw() 
{ 
    return p; 
} 

只是沒有操作的實施。

+0

@ sbi ::如何爲陣列做一個新的位置?請參閱我的代碼[鏈接](http://ideone.com/Yjc6y) – Atul 2012-03-26 10:28:29

+0

@Atul:我不確定我瞭解您的代碼。無論如何,你要做的是在足夠大的內存中創建數組的各個元素。然而,'std :: vector'就是這樣做的,並且有很多花裏胡哨的東西。另外,它比你自己的代碼更不可能是bug。那麼你爲什麼不簡單地使用它? – sbi 2012-03-26 10:57:43