【发布时间】:2017-07-23 18:08:16
【问题描述】:
我有一个 gamma 类,如下所示。
当 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 函数会导致程序因分段错误而终止。
注意: 互联网上的一些旧帖子(以及有关 stackoverflow 的一些旧问题)似乎暗示 std::shared_ptr 过去在那个时间点无法使用 boost 序列化。我认为 2017 年不会出现这种情况。无论如何,为了确定,我尝试用 boost::shared_ptr 替换 std::shared_ptr 并且分段错误仍然存在。
我不明白/不明白为什么会出现错误?
伽玛.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());
}
【问题讨论】:
-
您的代码不完整,无法按原样编译。
-
是的。我只添加了导致问题的类。这是一个更大项目的一部分,我在通过一系列其他课程后到达这个课程,从 main 开始。让我再看看,如果我能以一种干净的方式在这里添加这些类。
-
@overseas,最后两个函数load()和save()的类名也有小错误。我现在更正了。用户 sehe 只添加了一个 main() 来调用这个类,似乎他在那里没有分段错误。嗯,好奇!段错误可能是由其他原因引起的。几个小时后会检查。
-
尝试获得一个 mcve (stackoverflow.com/help/mcve),我们看看我们能做些什么。这段代码既不能编译(缺少实例),我也猜不出你面临什么问题,因为如果我纠正明显的错误并提供一个简单的
main,我就不会发现任何问题。
标签: c++ serialization boost deserialization shared-ptr