【发布时间】:2014-10-07 03:05:41
【问题描述】:
对于 POD 类型的对象,标准保证当您将对象的内容 memcpy 到一个 char 或 unsigned char,然后将内容 memcpy 回您的对象,该对象将保持其原始值。
现在请注意,对于非 POD 类型的对象没有这样的保证。所以我的问题是为什么会这样?
【问题讨论】:
-
memcpy 不能跟随引用/指针,或在复杂对象上调用复制构造函数。它所做的只是获取一块连续的内存,并将其复制到其他地方。
-
@Kam:考虑通过
memcpy复制std::string。现在有两个对象引用同一个缓冲区。他们每个人都会尝试释放缓冲区。 -
@Kam:“浅”副本通常对非 POD 类型无效。例如,如果您复制了
std::vector的字节(包含指向它拥有的内存的指针),然后修改了原始字节(导致它重新分配该内存),然后将字节复制回来,它现在将是无效的,指到它在重新分配之前拥有的内存。因此,您将不再拥有原始的“价值”,而是一些破碎的东西。 -
@imreal:所有对象,无论是否微不足道,都占用连续字节。我举了一个例子,说明复制非平凡类型的字节如何产生无效行为。
-
@imreal:不,谢谢,这对我来说太形而上学了。我会让其他人争论“存储区域”是否可以表示连续的字节范围之外的任何内容。
标签: c++