ofstream在极其简单的程序(GCC /代码:: Blocks)中的第一个输出上崩溃

时间:2019-02-11 15:17:04

标签: c++ gcc stl codeblocks ofstream

我有一个跨平台的日志记录应用程序,该应用程序是我周末在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;
}

2 个答案:

答案 0 :(得分:1)

#pragma pack(1)会更改随后包含的所有头文件的ABI,从而使标准C ++库(.so.a)与您的应用程序不兼容。

解决方案是删除该#pragma pack(1)。单独对您的结构进行包装。

答案 1 :(得分:0)

我强烈鼓励每个人特别出于这个原因停止使用那些pragma pack属性(因为它们可以逃脱,而且我也看到这种情况在生产中也发生了)。

相反,请根据需要使用编译器的语法(即attribute packed)将包属性应用于结构。