gpt4 book ai didi

c++ - 从 boost::archive:binary_iarchive 反序列化 std::string 时分配错误异常

转载 作者:行者123 更新时间:2023-11-30 02:21:39 28 4
gpt4 key购买 nike

作为实验,我正在尝试(反)序列化 std::map<std:string, ValueType>到/从二进制文件,逐个元素。

我正在使用这样的东西:

Live on Wandbox

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_tint 有不同的大小,下一次加载(即第一个 ia & key; 调用)将被破坏;然后,我猜 std::string 加载器将读回错误的字符串大小,从而导致抛出 bad_alloc

奇怪的是,由于您的平台(非)幸运字节顺序和签名表示,计数数据结果正确读取只是偶然......

在基于文本的情况下,计数数据是按文本解析的,因此序列化过程没有错误。

顺便说一句,IIRC 标准容器和变体只要它们的参数是自动序列化的,所以你不需要手动编写它们的序列化代码......

关于c++ - 从 boost::archive:binary_iarchive 反序列化 std::string 时分配错误异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48098379/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com