我从SO上发布的几个问题阅读了关于这一段的内容。为什么不保证memcpy对非POD类型安全?
我不能完全弄清楚为什么memcpy
不能保证对非POD类型安全。我的理解是,memcpy
只是一个按位拷贝。
下面是从标准
POD
类型T
的报价对于任何对象(比基类子对象等),对象是否保持T
类型的有效值, 底层字节(1.7)构成的对象可以被拷贝到char
或unsigned char
0.41)如果char
或unsigned char
阵列的内容 被复制回对象的阵列,该对象随后应保持其原始 值。# define N sizeof (T) char buf[N]; T obj ; // obj initialized to its original value std :: memcpy (buf , & obj , N); // between these two calls to std::memcpy, // obj might be modified std :: memcpy (& obj , buf , N); // at this point, each subobject of obj of // scalar type holds its original value
如果定义了复制构造函数,而不是按位复制,会发生什么? –
'memcpy'是一个按位拷贝。非POD类型不一定表现出按位复制语义。 – lapk
但这不是标准所说的......标准说......“对象将随后保持其原始值”,这在记忆非POD类型时是正确的。 – ROTOGG