2010-07-15 13 views

回答

10

您使用貼布新。像這樣:

new(pointer) MyClass(); 
+1

記住你解除分配內存之前調用析構函數。 – 2010-07-15 13:00:24

+0

太棒了,接受。 – Alex 2010-07-15 13:25:28

0

使用placement new

char memory[sizeof(Myclass)];  
void* place = memory;   

Myclass* f = new(place) Myclass(); 

記住

你也是破壞放置的對象負責。這是由明確調用析構函數來完成:

f->~Myclass(); 

編輯

讀馬丁·約克的評論和標準的相關部分後,這是很肯定的是,你不應該使用上述方法(使用放置在新堆疊上的對象)。正如Martin所建議的那樣,使用std::vector而不是placement new

+1

不要在放置新的時候使用堆棧/全局變量。該標準沒有提供關於堆棧/全局變量對齊的保證。因此,您應該使用動態分配的內存(因爲標準確實提供了有關其對齊的受保護者)。所以最簡單的方法是向我們提供一個向量(因爲向量的數據部分是動態分配的)。 – 2010-07-15 14:27:51

+0

@Martin:謝謝,我不知道。 :) – 2010-07-15 15:14:18

4

使用安置新。

std::vector<char> memory(sizeof(Myclass));  
void*    place = &memory[0];   

Myclass* f = new(place) Myclass(); 

不要使用由FAQ定義的方法:

char  memory[sizeof(Myclass)]; // No alignment guarantees on this. 

如在FAQ指出這是危險的,因爲標準沒有提供關於該存儲器的對準受助。使用標準向量確實可以保證對齊,因爲向量的數據部分是動態分配的,標準確實提供了有關動態分配內存對齊的保證。

來源:n2521(副本我有我的桌面上)第3.7.3.1

返回應適當排列,以便它可以轉換成任何完整的對象類型的帶有指針的指針基本對齊要求(3.11),然後用於訪問已分配存儲器中的對象或數組(直到通過調用相應的釋放函數明確釋放存儲器爲止)。

我們在3點。11

3.11對齊[basic.align]
5路線具有從弱到強或更嚴格的比對的順序。更嚴格的隊列具有更大的隊列值。滿足對齊要求的地址也滿足任何較弱的有效對齊要求。

不要忘記手動調用析構函數:

f->~Myclass() 
相關問題