Saya memiliki gamma kelas, seperti yang ditunjukkan di bawah ini.
Fungsi load menimbulkan kesalahan segmentasi, ketika fungsi make_nvp mencoba melakukan deserialisasi file xml yang ada. Kesalahan muncul ketika saya menggunakan std::shared_ptr<std::tuple<double,double,double>> val;
Jika sebaliknya val hanya std::tuple<double,double,double> val;
kemudian semuanya tampak berfungsi dengan baik (Tentu saja, saya mengubah fungsi pengambil dan penyetel sesuai).
Sekarang saya membahas banyak pertanyaan tentang stackoverflow dan saya mencari di Google dan melihat contoh di dokumentasi boost dan saya tidak tahu, mengapa fungsi load menyebabkan program dihentikan dengan kesalahan segmentasi.
Catatan: Beberapa postingan lama di internet (dan beberapa pertanyaan lama tentang stackoverflow) tampaknya menyiratkan bahwa std::shared_ptr dulunya tidak berfungsi dengan peningkatan serialisasi pada saat itu. Saya rasa hal ini tidak terjadi pada tahun 2017. Bagaimanapun, untuk memastikan, saya mencoba mengganti std::shared_ptr dengan boost::shared_ptr dan kesalahan segmentasi masih ada.
Saya tidak mengerti/mengerti mengapa kesalahan itu muncul?
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);
}
};
dan 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
sederhana saya tidak dapat mendeteksi masalah. - person overseas   schedule 06.03.2017