表達式new T[n]
可能會或可能不會初始化陣列中的每個對象,具體取決於T
是什麼。如何用分配器精確地模擬新的T [n]?
如何使用allocator
複製此初始化行爲?
struct Foo
{
int x;
Foo() : x(1)
{ }
};
Foo *p = new Foo[1];
assert(p[0].x == 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);
在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具有對大多數實現有效的類型。
我認爲你在這裏打擊設計。分配器接口是爲容器使用而設計的。容器被設計爲不包含未初始化的元素,所以它們對默認初始化沒有用處。
在C++ 11中,分配器已經放置了'construct's,的論據,包括沒有。 – 2012-07-24 08:38:08
@KerrekSB:drat,我記得那個,並且正在更新,但是你太快了。 – 2012-07-24 08:38:36
'operator new []'本身並不初始化任何東西。我誤解你的問題嗎?它只是返回內存,並且編譯器根據需要進行初始化。 – 2012-07-24 07:45:09
@ 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