错误访问 读入对象后
BAD ACCESS After reading into object
我正在为一个学校项目制作一个密码管理器,如果在其上使用所有贴纸,则会带来巨大的保修无效。目的是能够对程序中的数据进行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 或类似的东西将其解析回去。
感谢您的帮助:)
相关文章:
- 按基类对象访问派生类资源时出错
- 使用基类对象访问派生的仅类方法
- 从 const 对象访问非 const 方法
- 如何在C++中使用类对象访问指针数据成员
- 如何通过不同的指针使用类的对象访问结构?(链表)(C++)
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 为什么引用类型在使用临时对象访问时是左值
- 从父对象 c++ 访问子方法
- 无法通过指针或对象 c++ 访问受保护的成员
- 为什么可以从类中的对象访问类的私有变量
- 对类似"struct {double, int}"对象使用reinterpret_cast进行对象访问
- 通过无符号 char 别名进行对象访问,加载和存储时会发生什么?
- 从对象访问结构枚举
- 如何全局创建对象并使用该对象访问全局范围内的公共成员函数
- 在C 中,可以从第三个共享对象访问其他两个不同共享对象
- 如何在C 中提供一个可呼叫的对象访问,例如lambda
- C 向量对象访问
- C++是否可以从同级第二个派生对象访问第一个派生对象的受保护基础数据成员?
- 如何从类内实例化的对象访问私有变量
- 多态性:通过类文本或对象访问静态成员