2017-09-15 84 views
1

我一直在閱讀關於在SO上放置新東西的一些問題,我發現了一些不同的方式來使用它,我想我會在這裏問一下。我明白,新的放置方式基本上是一種創建對象的方式,並將它放在已分配的選定內存中;我只是不明白所有的錯綜複雜。C++「placement new」錯綜複雜

First one只見SO使用這個例子(從C++引物):

const int BUF = 512; 
const int N = 5; 
char buffer[BUF]; 
double * pd1; 
pd1 = new (buffer) double[N]; 

Second one只見SO使用這個例子(從C++的Primer Plus):

char * buffer = new char[BUF]; //get a block of memory 
JustTesting *pc1, *pc2; 

pc1 = new (buffer) JustTesting; //Place object in buffer 

的主要區別這兩者之間的區別在於,在第一個代碼塊中,buffer是一個char數組,而在第二個示例中它是一個指向char數組的指針,但這兩個代碼塊都包含new (buffer)

我的第一個問題是:在此上下文中使用placement new時,它可以接受一個對象還是它的地址,如果是這樣,是首選的嗎?

我也看過放置新的沒有左值使用。見下文。

new(&myObject) myClass; 

我的第二個問題是:安置新的與沒有左值之間有什麼區別?

+5

一個數組變量衰減到指針的第一要素,所以雖然你的兩個例子看起來不同,他們實際上是使用指針都放置新的下面實現。 –

+2

您可能需要更好地理解指針和數組之間的關係 - 兩個示例都使用指針。 –

+0

@Mark Ransom哦,沒有意識到它是那麼簡單。謝謝,這回答我的第一個問題。 – ImaginaryHuman072889

回答

1

我明白,放置new基本上是一種方法,讓您創建一個對象並將其賦予您已選擇的已分配內存的某個位置;

不完全是。

new expression調用相應的operator new,然後調用構造函數。請注意,這些是兩個不同的事情,名字相似

放置new表達式跳過分配內存並且只調用構造函數。這是通過使用放置void* operator new(std::size_t count, void* ptr),它什麼也不做,並返回ptr實現的。

這是您的工作,爲使用新位置時正在初始化的對象提供存儲。

+1

'new expression'和'operator new'是不同的。可能還提到['new operator'](https:// stackoverflow。com/questions/1885849/new-operator-and-operator-new之間的差異)是第三個單獨的事情。 –

+0

@MooningDuck根據我以前的理解以及該鏈接的接受答案,new操作符與new操作符和new操作符以及構造函數是一樣的。 –

+0

有'new表達式'涉及調用相應的'operator new'。可以直接調用'operator new'。這裏只有兩件事。 –

0

你的第一個問題已經回答了。對於你的第二個問題 - 放置新的和沒有左值的區別是什麼?

由於placement new返回在第二個參數中傳遞的地址,因此要求左值存儲該地址是可選的。見從Microsoft Visual工作室 -

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