我有一个类gamma,如下所示。shared_ptr的介绍导致反序列化时出现分段错误(使用boost :: serialization)
当make_nvp函数尝试反序列化现有的xml文件时,加载函数会引发段错误。该错误是当我使用std::shared_ptr<std::tuple<double,double,double>> val;
相反,如果VAL只是std::tuple<double,double,double> val;
然后一切似乎很好地工作(当然,我改变了getter和setter函数相应)。
现在我回顾了一堆关于stackoverflow的问题,我用google搜索了一下boost文档中的例子,我弄不明白为什么load函数会导致程序以分段错误终止。
注:互联网(以及计算器一些老问题)上的一些旧文章似乎在暗示用在那个时间点与升压序列化到不行那的std :: shared_ptr的。我不认为2017年会出现这种情况。不管怎样,只是可以肯定的是,我尝试用boost :: shared_ptr替换std :: shared_ptr,并且分段错误仍然存在。
我不明白为什么会出现错误?
gamma.h
#pragma once
#include <map>
#include <boost/serialization/access.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <tuple>
namespace boost
{
namespace serialization
{
template<typename Archive>
void serialize(Archive & ar, std::tuple<double, double, double> & t,
const unsigned int version)
{
ar & boost::serialization::make_nvp("t0",std::get<0>(t));
ar & boost::serialization::make_nvp("t1",std::get<1>(t));
ar & boost::serialization::make_nvp("t2",std::get<2>(t));
}
}
}
class Gamma
{
public:
static void save(std::ostream& os);
static void load(std::istream& is);
std::shared_ptr<std::tuple<double, double, double>> getterX() const;
void setterX(const std::tuple<double, double, double> &val);
private:
std::shared_ptr<std::tuple<double,double,double>> val;
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive& arc, const unsigned int version)
{
arc & boost::serialization::make_nvp("val", val);
}
};
和gamma.cpp
#include "gamma.h"
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/utility.hpp>
Gamma &Gamma::instance()
{
static Gamma obj;
return obj;
}
std::shared_ptr<std::tuple<double, double, double>> Gamma::getterX() const
{
return val;
}
void Gamma::setterX(const std::tuple<double, double,double> &v)
{
if (nullptr == val) {
m_touchDownCalibration = std::make_shared<std::tuple<double, double,double>>();
}
*val = v;
}
const char* TAG = "tag";
void Gamma::save(std::ostream& os)
{
boost::archive::xml_oarchive arc(os);
arc & boost::serialization::make_nvp(TAG,instance());
}
void Gamma::load(std::istream& is)
{
boost::archive::xml_iarchive arc(is);
arc & boost::serialization::make_nvp(TAG,instance());
}
你的代码不完整,不能按原样编译。 – overseas
是的。我只添加了导致问题的类。这是一个更大的项目的一部分,我通过一系列其他课程,从主要开始,到达这个班级。让我再看看,如果我可以用干净的方式在这里添加这些类。 –
@overseas,在最后两个函数load()和save()的类名中也有一个小错误。我现在纠正了。 用户sehe添加了一个main()来调用这个类,看起来他在那里没有分段错误。嗯,好奇!可能seg故障是由其他原因引起的。将在几个小时内检查。 –