从 boost::存档:binary_iarchive 反序列化 std::string 时出现错误的分配异常
Bad allocation exception when deserializing std::string from boost::archive:binary_iarchive
作为一个实验,我正在尝试逐个元素地(反(序列化二进制文件的std::map<std:string, ValueType>
。
我正在使用这样的东西:
住在魔杖盒上
void Save(const std::string& fname, const MapType& c)
{
std::ofstream f(fname.c_str(), std::ios::binary);
boost::archive::binary_oarchive oa(f, boost::archive::no_header);
oa & c.size();
for (auto& e : c)
{
oa & e.first;
oa & e.second;
}
}
void Load(const std::string& fname, MapType& c)
{
std::ifstream f(fname.c_str(), std::ios::binary);
boost::archive::binary_iarchive ia(f, boost::archive::no_header);
int count;
ia & count;
for (int i = 0; i < count; ++i)
{
std::string key;
ValueType value;
ia & key;
ia & value;
c[key] = value;
}
}
顺便说一下:
using ValueType = boost::variant<bool, int, double, std::string>;
using MapType = std::map<std::string, ValueType>;
保存后,我重新加载文件。count
读取正确,但第一个key
给出错误的分配异常。
有什么想法吗?
当我将binary_oarchive
和binary_iarchive
替换为它们各自的文本等效项时,相同的代码效果很好。
你保存oa & c.size();
然后加载int count;ia & count;
:如果碰巧size_t
和int
的大小不同,下一次加载(即第一次ia & key;
调用(将被破坏; 然后,我猜std::string
加载器会读回错误的字符串大小,导致抛出bad_alloc
。
奇怪的是,计数数据结果只是偶然正确读取,由于您的平台(不(幸运的字节序和有符号表示......
在基于文本的情况下,计数数据以文本方式解析,因此序列化不会出错。
顺便说一下,IIRC 标准容器和变体在其参数存在时都可以自动序列化,因此您无需手动编写它们的序列化代码......
相关文章:
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- [longjmp/setjmp]c++ 相同的代码窗口有异常 Linux 没有错误并且运行良好
- 发生此错误:在0x0F2BFB7C(基于.dll)时引发异常 尝试更改大小是问题吗?
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 引发异常:读取访问冲突.**此**0x40错误
- 从 C# 调用 C++ DLib 会导致错误的分配异常
- 错误 : 异常 : 引发未处理的异常: 读取访问冲突.0xDDDDDDDD临时温度
- Windows错误:异常:使用从C++到Python的ctypes创建DLL时出现访问冲突或Windows错误193
- C++执行期间的类成员函数错误/异常处理
- 无法捕获C++长度错误异常
- 内存读/写错误异常
- 字符串转换错误:异常还是错误代码
- 类中的错误/异常捕获
- 在库中引发逻辑错误异常或中止
- POCO C++SAX解析器:如果xml文档编码是ANSI,那么下一条语句不是读取并抛出编码错误异常
- 捕获 Segfault 或任何其他错误/异常/信号C++例如在 Java 中捕获异常