ofstream 在极其简单的程序中首次输出时崩溃 (GCC/Code::Blocks)

ofstream crashes on first output in extremely simple program (GCC/Code::Blocks)

我周末在 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;
}

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

解决方案是删除 #pragma pack(1)。将包装单独应用于您的结构。

我强烈建议大家停止使用这些 pragma pack 属性(因为它们可以逃脱,而且我在生产中也看到过这种情况)。

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