我有一个跨平台的日志记录应用程序,该应用程序是我周末在Windows上使用MSVC开发的,然后在我的Linux上使用GCC / Code :: Blocks打开,它在打开输出文件后立即崩溃使用ofstream。
特定的代码如下所示,并且实际上是程序中的前8行
stringstream strFile;
strFile<<filename;
strFile<<".result.out";
out.open(strFile.str().c_str());
out<<"Count"<<"\t";
out<<"TM"<<"\t";
out<<"Type"<<"\t";
out<<"Seconds"<<"\t";
弄清楚问题之后,我后来制作了一个具有相同症状的最小应用程序
#pragma pack(1) // remove this and it will run without incident
#include <fstream>
using namespace std;
int main()
{
ofstream out;
out.open("test.txt");
for(int x = 0;x < 10000; x++)
{
out<<"This is a test"<<endl; // crashes on first output
}
out.close();
return 0;
}
答案 0 :(得分:1)
#pragma pack(1)
会更改随后包含的所有头文件的ABI,从而使标准C ++库(.so
或.a
)与您的应用程序不兼容。
解决方案是删除该#pragma pack(1)
。单独对您的结构进行包装。
答案 1 :(得分:0)
我强烈鼓励每个人特别出于这个原因停止使用那些pragma pack
属性(因为它们可以逃脱,而且我也看到这种情况在生产中也发生了)。
相反,请根据需要使用编译器的语法(即attribute packed
)将包属性应用于结构。