可能重複:
Create new C++ object at specific memory address?如何在內存中的特定位置創建對象本身?
我寫什麼本質上是一個對象池分配,這將分配一個單獨的類。我正在分配足夠的內存以適合我需要的對象,並且我將指針指向內部的空間。
現在我的問題是這樣的:一旦我在池中獲得了一個指針,我該如何構造一個對象呢?
可能重複:
Create new C++ object at specific memory address?如何在內存中的特定位置創建對象本身?
我寫什麼本質上是一個對象池分配,這將分配一個單獨的類。我正在分配足夠的內存以適合我需要的對象,並且我將指針指向內部的空間。
現在我的問題是這樣的:一旦我在池中獲得了一個指針,我該如何構造一個對象呢?
您使用貼布新。像這樣:
new(pointer) MyClass();
安置新可能會有所幫助。
char memory[sizeof(Myclass)];
void* place = memory;
Myclass* f = new(place) Myclass();
記住
你也是破壞放置的對象負責。這是由明確調用析構函數來完成:
f->~Myclass();
編輯
讀馬丁·約克的評論和標準的相關部分後,這是很肯定的是,你不應該使用上述方法(使用放置在新堆疊上的對象)。正如Martin所建議的那樣,使用std::vector
而不是placement new
。
不要在放置新的時候使用堆棧/全局變量。該標準沒有提供關於堆棧/全局變量對齊的保證。因此,您應該使用動態分配的內存(因爲標準確實提供了有關其對齊的受保護者)。所以最簡單的方法是向我們提供一個向量(因爲向量的數據部分是動態分配的)。 – 2010-07-15 14:27:51
@Martin:謝謝,我不知道。 :) – 2010-07-15 15:14:18
使用安置新。
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()
記住你解除分配內存之前調用析構函數。 – 2010-07-15 13:00:24
太棒了,接受。 – Alex 2010-07-15 13:25:28