gpt4 book ai didi

c++ - GCC 下的对象加载段错误

转载 作者:行者123 更新时间:2023-11-30 00:57:28 25 4
gpt4 key购买 nike

这些方法应该保存和加载它们关联的整个对象。当我通过 gcc 在 Linux 下编译程序时,保存似乎有效,但在加载时出现段错误。当我通过 Visual Studio 编译器在 Windows 下编译它时,它就像在做梦一样。我不确定有什么区别,但我有一种预感,它涉及一些 gcc 奇怪之处。

两种方法:

void User::SaveToFile()
{
ofstream outFile;
string datafile_name = username + "_data";
outFile.open(datafile_name.c_str(), ios::binary);
outFile.write((char*)this, sizeof(*this));
}
void User::LoadFromFile(string filename)
{
ifstream inFile;
inFile.open(filename.c_str(), ios::binary);
inFile.read((char*)this, sizeof(*this));
}

声明:

class User
{
private:
string username;
string realname;
string password;
string hint;
double gpa;
vector<Course> courses;
public:
double PredictGPA();
void ChangePassword();
void SaveToFile();
void LoadFromFile(string filename);

void SetUsername(string _username){username = _username;}
string GetUsername(){return username;}
void SetRealname(string _realname){realname = _realname;}
string GetRealname(){return realname;}
void SetPass(string _password){password = _password;}
string GetPass(){return password;}
void SetHint(string _hint){hint = _hint;}
string GetHint(){return hint;}
};

最佳答案

您的 class User 不是 POD 类型,也不是普通旧数据类型(C 结构是)。你不能只是按位读写它的内存并期望它能工作。 stringvector 都不是 POD,它们保留指向动态分配数据的指针。读回这些内容时,尝试访问无效内存将导致段错误。更重要的是,stringvector 的内容实际上根本没有被保存,因为它们不在对象的内存布局中(它有时可能与string 与 SBO,但它只是机会而且仍然未定义)。

关于c++ - GCC 下的对象加载段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com