2014-10-17 26 views
3

當我做了以下內容:在MSVC 2012中放置新陣列時出錯?

T* ptr2 = new (ptr1) T(); 

我獲得PTR1 == PTR2

當我這樣做:

T* ptr2 = new (ptr1) T[6]; 

我獲得,2012 MSVC下調試,PTR2 > ptr1(off by 3 bytes)

但是,「新」文件中的代碼是:

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

我假設一些調試信息被加入,但我不能讓這個

通過的malloc獲得的初始PTR1感,所以我認爲它應該對齊,以任何可能的類型,所以我不要認爲這是一個問題。

我在做一些不應該在這裏工作的東西嗎?爲什麼會ptr2!= ptr1? 謝謝!

+1

Array'new'會存儲一些額外的開銷(針對數組的大小),並且由於開銷的數量沒有指定,所以使用placement array new通常不是一個好主意。 – 2014-10-17 23:26:24

+0

@ T.C。你確定 ?我不明白爲什麼它會被需要,因爲內存是由調用者管理的,再加上我沒有在實現文件中看到它 – lezebulon 2014-10-17 23:29:59

+0

http://stackoverflow.com/questions/8720425/array-placement-new-requires -unspecified頂置式 - 的緩衝區。開銷部分由編譯器直接處理,而不是放置在新函數中。 – 2014-10-17 23:30:55

回答

0

我不認爲C++佈局新是嚴格要求放置客戶端代碼可以看到的對象的開始,在您傳遞給新的緩衝區的開始。

只需要將它放在裏面的某個地方。如果編譯器沒有在其他任何地方分配任何緩衝區,編譯器完全可以在空間上做任何事情。

所以你不應該依賴於ptr1和ptr2具有相同的值,任何使用新的位置,而不僅僅是這一個。

雖然我並沒有死定。我可能是錯的。