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
)将包属性单独应用于结构。
我周末在 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
)将包属性单独应用于结构。