Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Visual Studio 2012中加载Boost::Serialization文本时发生访问冲突_C++_Visual Studio 2012_Serialization_Boost_Access Violation - Fatal编程技术网

C++ 在Visual Studio 2012中加载Boost::Serialization文本时发生访问冲突

C++ 在Visual Studio 2012中加载Boost::Serialization文本时发生访问冲突,c++,visual-studio-2012,serialization,boost,access-violation,C++,Visual Studio 2012,Serialization,Boost,Access Violation,全部, 我已经编写了使用boost序列化来序列化API调用的代码。保存是在linux上执行的,加载是在windows上执行的,因此我首先转到了文本存档。我可以在linux上轻松地保存和加载归档文件,但是当我切换到windows时,在读取第一个结构时创建文本时,我会遇到访问冲突 在使用调试器逐步完成boost代码之后,我发现了问题所在 在“boost/archive/basic_text_iprimitive.hpp”中,我在第84行得到了访问冲突: template<class T>

全部,

我已经编写了使用boost序列化来序列化API调用的代码。保存是在linux上执行的,加载是在windows上执行的,因此我首先转到了文本存档。我可以在linux上轻松地保存和加载归档文件,但是当我切换到windows时,在读取第一个结构时创建文本时,我会遇到访问冲突

在使用调试器逐步完成boost代码之后,我发现了问题所在

在“boost/archive/basic_text_iprimitive.hpp”中,我在第84行得到了访问冲突:

template<class T>
void load(T & t)
{
    if(is >> t)
        return;
    boost::serialization::throw_exception(
        archive_exception(archive_exception::input_stream_error)
    );
}
不幸的是,这起作用了,我的程序一直在运行。这是一个可怕的黑客,所以我尝试了其他的东西。调用函数如下所示:

void load(version_type & t){
    unsigned int v;
    load(v);
    t = version_type(v);
}
相当温和。我首先尝试将无符号int初始化为0,但没有任何效果。然后,我的同事建议将未签名的int改为int(尽管是开玩笑的)。果然奏效了。这也是boost代码中的一个变化,所以我不希望保留修复

不幸的是,我无法在无法共享的代码之外重现这个问题。我已经能够创建一个新的VisualStudio项目并加载该文件,因此我不确定更改了哪些设置会导致这样的问题

任何帮助都将不胜感激

编辑

我能解决这个问题。我仍然不确定原因,但问题源于chi调用序列化代码的方式

我所拥有的是:

int main()
{
    struct s;
    std::ifstream infile("output.txt");
    std::ifstream types("types.txt");        

    boost::archive::text_iarchive ia(infile);

    int type = 0;
    types >> type;

    switch( type )
    {
      case 1:
       ia >> s;
    }

    return 0;
}

将整个“案例1”放在它自己的范围内[包括声明结构]非常有效。

我建议修复不是修复。这似乎是一种依靠未定义行为的变通方法。这些症状或多或少会导致拼写缓冲区溢出/堆栈损坏。(试着在linux上的valgrind下运行-unmodified-code?)一切都在linux上运行,但正如您所说,这可能是一个无声的错误,系统可以从中恢复。我将通过valgrind(其目的是在较短的时间内通过callgrind运行模型)完成它,并向您报告。
int main()
{
    struct s;
    std::ifstream infile("output.txt");
    std::ifstream types("types.txt");        

    boost::archive::text_iarchive ia(infile);

    int type = 0;
    types >> type;

    switch( type )
    {
      case 1:
       ia >> s;
    }

    return 0;
}