c++oding="utf-8" ?>
直接用 write() 写含 std::string 的结构体会丢失字符串内容,因其内部仅存指针、长度、容量,真实数据在堆上;正确做法是手动序列化:先写固定宽度长度(如 uint32_t),再写字符数据。

直接用 write() 写结构体会导致字符串内容丢失
因为 std::string 在内存里不是纯数据块,它只存指针、长度、容量三个字段(具体布局因标准库实现而异),真正字符数据在堆上。用 write() 对结构体做 memcpy-style 二进制写入,只会把指针值写进文件,读取时指针已失效,解引用必崩。
- 常见错误现象:
read()后std::string构造失败、data()返回空指针、size()为 0 或乱码 - 典型场景:跨进程共享结构体二进制文件、用
fread/fwrite做快速序列化 - 别信“结构体没虚函数就能
memcpy”——只要含std::string、std::vector等非 POD 类型,就不是 trivially copyable
手动序列化每个 std::string 字段(推荐)
本质是把字符串长度和内容分开写:先写 size()(建议用固定宽度整数,如 uint32_t),再写 c_str() 指向的字节流。读取时反向操作即可。
- 必须用
uint32_t或size_t(注意跨平台大小)写长度,不能直接写size_t—— Windows 上是 4 字节,Linux x64 是 8 字节,不统一就无法跨平台读 -
std::string的c_str()保证以

