它与呼叫做分配器功能分配()来获得原始内存和下面的呼叫分配器构建(迭代器,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如果类有任何类型的用户定义的构造函数,那么没有编译器生成的默认构造函数 –