2015-05-11 119 views

回答

26

比方说你已经通过malloc在堆上分配了一些内存,并且有一个指针T* p。您最终会得到未初始化的存储,因为所有malloc都会将您请求的大小标记为分配的位置(另一方面,new实际上构造对象并因此使分配的区域初始化存储)。由于从p开始存储位置没有T坐在那里类型的有效对象,你不能因为是在p没有T类型的对象调用赋值运算符上做到这一点

T a; 
*p = a; 

。相反,你将有一个构造T类型的对象在位置p使用placement new

T a; 
new (p) T{a}; 

std::uninitialized_copy与您要在复制到未初始化的存储范围打交道时,简单地实现了上面的代码片断的范围版本。

+1

你的答案指甲,删除我的,+1。 – vsoftco

+0

'uninitialized_copy'与'memcpy'完全等价吗? –

+1

@MattMcNabb这只有在它们可以复制的情况下才是真的,AFAIK。 – Pradhan

相关问题