2012-07-24 16 views
1

表達式new T[n]可能會或可能不會初始化陣列中的每個對象,具體取決於T是什麼。如何用分配器精確地模擬新的T [n]?

如何使用allocator複製此初始化行爲?

struct Foo 
{ 
    int x; 
    Foo() : x(1) 
     { } 
}; 

Foo *p = new Foo[1]; 
assert(p[0].x == 1); 
+2

'operator new []'本身並不初始化任何東西。我誤解你的問題嗎?它只是返回內存,並且編譯器根據需要進行初始化。 – 2012-07-24 07:45:09

+0

@ JohannesSchaub-litb:'struct Foo {int x; Foo():x(1){}}; Foo * p = new Foo [1]; assert(p [0] .x == 1);'(編輯:哦,我明白你的意思了,我的編輯清楚了嗎?) – Mehrdad 2012-07-24 07:46:28

回答

3

在C++ 03中,分配器接口只知道初始化對象的一種方法,那就是從另一個對象複製。 C++ 11有更多。

您正在詢問默認初始化,這意味着(近似)「無所事事或調用默認構造函數」。分配器接口不能在C++ 03中完成後者。

我想你可以寫這樣的:

T *ra = allocator.allocate(1); 
if (!is_pod<T>::value) { 
    // in C++03 
    allocator.construct(ra, T()); 
    // in C++11 
    allocator.construct(ra); 
} 

is_pod測試可能是錯的,但。檢查標準的確切條件,默認初始化什麼都不做。很明顯,在C++ 03中不存在is_pod,但我隱約記得Boost具有對大多數實現有效的類型。

我認爲你在這裏打擊設計。分配器接口是爲容器使用而設計的。容器被設計爲不包含未初始化的元素,所以它們對默認初始化沒有用處。

+0

在C++ 11中,分配器已經放置了'construct's,的論據,包括沒有。 – 2012-07-24 08:38:08

+1

@KerrekSB:drat,我記得那個,並且正在更新,但是你太快了。 – 2012-07-24 08:38:36