g++ 9.2.1 (Linux) 导致段错误,但 windows 上的代码块不会
g++ 9.2.1 (Linux) causes seg fault but Codeblocks on windows does not
以下简单代码(二进制文件处理)在与 Codeblocks 17.12 (mingw32-g++) 捆绑的编译器上运行良好 Windows 但在 g++ 9.2.1 中出现分段错误 Linux (在 Ubuntu 19.10):
#include <iostream>
#include <fstream>
using namespace std;
class A {
public:
int x;
string y;
};
int main()
{
ofstream k;
A m;
m.x = 10;
m.y = "Hello";
k.open("file.dat", ios::binary);
k.write(reinterpret_cast<char *>(&m), sizeof(A));
k.close();
ifstream i;
A t;
i.open("file.dat", ios::binary);
i.seekg(0, ios::beg);
i.read(reinterpret_cast<char *>(&t), sizeof(A));
cout << t.x << " " << t.y;
i.close();
return 0;
}
我是不是做错了什么,windows 上的最小 g++ 可以原谅我,但 g++-Linux 不是?还是我发现了一个错误?
您的程序有未定义的行为。
你不能按字节顺序序列化像 std::string
这样的复杂对象。
未定义行为的结果可能会有所不同;在您的 Linux 安装中,您可能正在目睹 "small string optimisation",其中您的字符串数据足够小,可以放入一个小的就地缓冲区中。这避免了在 Windows 上导致崩溃的任何动态内存。也许 Windows 正在检测不良行为,或者它有一个更小的 SSO 缓冲区,或者根本 none!
但是代码仍然有未定义的行为。
以下简单代码(二进制文件处理)在与 Codeblocks 17.12 (mingw32-g++) 捆绑的编译器上运行良好 Windows 但在 g++ 9.2.1 中出现分段错误 Linux (在 Ubuntu 19.10):
#include <iostream>
#include <fstream>
using namespace std;
class A {
public:
int x;
string y;
};
int main()
{
ofstream k;
A m;
m.x = 10;
m.y = "Hello";
k.open("file.dat", ios::binary);
k.write(reinterpret_cast<char *>(&m), sizeof(A));
k.close();
ifstream i;
A t;
i.open("file.dat", ios::binary);
i.seekg(0, ios::beg);
i.read(reinterpret_cast<char *>(&t), sizeof(A));
cout << t.x << " " << t.y;
i.close();
return 0;
}
我是不是做错了什么,windows 上的最小 g++ 可以原谅我,但 g++-Linux 不是?还是我发现了一个错误?
您的程序有未定义的行为。
你不能按字节顺序序列化像 std::string
这样的复杂对象。
未定义行为的结果可能会有所不同;在您的 Linux 安装中,您可能正在目睹 "small string optimisation",其中您的字符串数据足够小,可以放入一个小的就地缓冲区中。这避免了在 Windows 上导致崩溃的任何动态内存。也许 Windows 正在检测不良行为,或者它有一个更小的 SSO 缓冲区,或者根本 none!
但是代码仍然有未定义的行为。