C++:关闭控制台应用后出现异常错误

c++: exception error after closing console app

本文关键字:异常 错误 应用 控制台 C++      更新时间:2023-10-16

我正在学习 c++,有一个关于读取和写入文件对象的问题。

我创建了一个名为 Person 的类。在我的主文件中,我创建了 Person 类的两个实例。我将实例 1 写入名为"person.dat"的文件,然后将其读回我创建的第二个实例中。一切都按预期工作,除了程序关闭后抛出异常。我不确定为什么或是什么原因造成的。

异常:0x55ABDF62 (msvcp120d.dll) 中未处理的异常 写入二进制对象.exe: 0xC0000005:访问违规写入 位置0xFEEEFEEE。

谁能为我阐明这一点?

代码:人.h

#include <iostream>
#include <string>
using namespace std;
class Person {
    private:
        string name;
        string surname;
        int age;
    public:
        Person();
        Person(string, string, int);
        void setName(string);
        void setSurname(string);
        void setAge(int);
        string getName();
        string getSurname();
        int getAge();
};
Person::Person() {}
Person::Person(string _name, string _surname, int _age) {
    setName(_name);
    setSurname(_surname);
    setAge(_age);
}
void Person::setName(string _name) {
    name = _name;
}
void Person::setSurname(string _surname) {
    surname = _surname;
}
void Person::setAge(int _age) {
    age = _age;
}
string Person::getName() {
    return name;
}
string Person::getSurname() {
    return surname;
}
int Person::getAge() {
    return age;
} 

代码:程序.cpp

#include <iostream>
#include <fstream>
#include "Person.h"
using namespace std;
int main() {
    //create person 1
    Person person;
    person.setName("Kobus");
    person.setSurname("Beets");
    person.setAge(24);
    //write person 1 to file
    ofstream out;
    out.open("person.dat", ios::binary);    
    out.write(reinterpret_cast <char *> (&person), sizeof(person));
    out.close();    
    //create person 2
    Person person2;
    person2.setName("John");
    person2.setSurname("Doe");
    person2.setAge(26);    
    //read person 1 from file into person 2
    ifstream in;
    in.open("person.dat", ios::binary);
    in.read(reinterpret_cast <char *> (&person2), sizeof(person2));
    in.close();
    //print new person 2
    cout << " " << person2.getName() << " " << person2.getSurname() << " is " << person2.getAge() << " year(s) old... nn ";
    system("pause");
    return 0;
}

你不能以这种方式直接将对象写入文件,除非你有 POD 风格的数据结构(例如,只有简单的 C 数据类型或其结构/类,没有指针,没有C++数据类型)。

在您的情况下,Person 有两个 std::string 成员,它们本身包含指针和其他内容,一旦写入文件并重新读取到内存中,它们就会失去其含义。

您需要添加更多逻辑来编写实际的字符串内容(请参阅 std::string::c_str(), std::string::d ata(), std::string::size())。

异常可能是由 std::string desctructor 引起的,它尝试释放或访问已释放的内存。