我可以克隆C++对象的字节,覆盖原始字节,然后将这些字节复制回去吗?

tem*_*def 7 c++ language-lawyer

这纯粹是假设,但我不确定以下代码是否会导致根据C++规范的未定义行为.我想复制一个对象中的字节,通过用零覆盖来爆炸对象,然后将旧字节复制回来.我可以这样做而不会导致未定义的行为吗?

示例代码:

NonPODType o;
char bytes[sizeof(o)];

memcpy(bytes, &o, sizeof(o));
memset(&o, 0, sizeof(o));
memcpy(&o, bytes, sizeof(o));
Run Code Online (Sandbox Code Playgroud)

R. *_*des 9

一般来说,没有.有一个明确的保证,这适用于§3.9/ 2上的平凡可复制类型,但对于其他类型没有这样的东西.

对于具有普通可复制类型的任何对象(基类子对象除外)T,无论对象是否保持有效的类型值,构成对象 T的基础字节(1.7)都可以复制到char或的数组中unsigned char.如果阵列的内容 charunsigned 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
Run Code Online (Sandbox Code Playgroud)

- 末端的例子 ]