它與呼叫做分配器功能分配()來獲得原始內存和下面的呼叫分配器構建(迭代器,VAL)使用來構建由複製元素放置新,即類似於這樣:
/* approach similar to std::uninitialized fill taken */
template<typename T, typename A >
vector<T,A>::vector(size_type n, const T& val, const A& a) : alloc(a) // copy the allocator
{
/* keep track of which elements have been constructed
* and destroy those and only those in case of exception */
v = alloc.allocate(n); // get memory for elements
iterator p; // declared before try{} so it is still valid in catch{} block
try {
iterator end = v + n;
for(p = v; p != end; ++p)
alloc.construct(p, val); /* construct elements (placement new):
e g. void construct(pointer p, const T& val)
{ ::new((void *)p) T(val); } */
last = space = p;
} catch(...) {
for(iterator q = v; q != p; ++q)
alloc.destroy(q); /* destroy constructed elements */
alloc.deallocate(v, n); /* free memory */
throw; /* re-throw to signal constructor that failed */
}
}
在C++分配器被用於絕緣的算法和容器必須從物理存儲器的細節分配內存實施者。直接使用的uninitialized_fill
方法也可以採取:
std::uninitialized_fill(v, v + n, val); /* copy elements with (placement new):
e g. void construct(pointer p,
const T& val)
{ ::new((void *)p) T(val); } */
這是在Bjarne的Stroustrup的 「C++ ...第3版」 更詳細地描述。 Here是基於此編寫的示例。
它*不*使用array-'new'完成。 Array-'new'是語言的完全錯誤特徵,完全沒用,正如你剛發現的那樣。相反,內存分配和對象構造是完全分開完成的。 –
如果沒有提供明確的默認編譯器,編譯器會創建一個。 – littleadv
@littleadv如果類有任何類型的用戶定義的構造函數,那麼沒有編譯器生成的默認構造函數 –