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