错误访问 读入对象后

BAD ACCESS After reading into object

本文关键字:对象 访问 错误      更新时间:2023-10-16

我正在为一个学校项目制作一个密码管理器,如果在其上使用所有贴纸,则会带来巨大的保修无效。目的是能够对程序中的数据进行CRUD并以"加密"形式将其写入磁盘。

我有一个基类型和子类型的动态数组,我可以使用 Library::WriteToFiles(( 写入内存,并使用 Library::ReadFromFiles(( 从内存中读取。这一切都在我的调试设置中效果很好,我总是编写然后立即读回内存。

int main() {
bool debug = true;
if (debug) {
Library library = Library();
library.Add(new Password("Outside", "yobro"));
library.Add(new Password("Wut", "idk"));
library.Add(new UsernameLogin("Yo", "M8", "James May"));
library.Print();
cout << endl;
library.WriteToFiles();
library.ReadFromFiles();
library.Print();
return 0;
}

但是当我注释掉 Write 调用时,我在读取函数中从这个位获得了错误的访问

void Library::ReadFromFiles() {
this->Clear();
ifstream baseFileObject;
ifstream usrNameFileObject;
baseFileObject.open("base.txt");
while (true) {
if (baseFileObject.eof()) break;
Password* password = new Password();
baseFileObject.read((char*) password, sizeof(*password));
if ( ! password->IsEmpty()) { // <- Trying to call IsEmpty() throws a BAD ACCESS
Add(password);
}
}
baseFileObject.close();

当我尝试调用 Password 类中非虚拟的其他函数时,它们运行良好。IsEmpty(( 在读取之前也能运行良好。我检查了指针,它始终保持不变。文件将正确打开,数据将读入对象。

最让我困惑的是,为什么当我已经在执行中编写时它会起作用。如果读取这样的对象会损坏 vtable,那么为什么它有时会起作用?

编辑: 密码类有 3 个变量。两根弦和一个布尔值。没有指针。 以下是公共职能。我只是在虚拟功能方面遇到问题。

public:
virtual int Type();
virtual string ToString();
virtual bool IsEmpty();
virtual bool Encrypt(unsigned int key);
virtual bool Decrypt(unsigned int key);
[[nodiscard]] bool isEncrypted() const;
[[nodiscard]] const string &getPassword() const;
void setPassword(const string &newPassword);
[[nodiscard]] const string &getLocation() const;
void setLocation(const string &newLocation);
int PasswordStrength();

已经明确指出,这一行:

baseFileObject.read((char*) password, sizeof(*password));

只是不适用于我的用例。序列化是显而易见的、可扩展的、理想的解决方案,但由于这是一个学校项目,我打算使用老式的方式将文本写入文件并使用 sstream 或类似的东西将其解析回去。

感谢您的帮助:)