为什么这个cpp项目失败了?

Why does this cpp program fail?

本文关键字:失败 项目 cpp 为什么      更新时间:2023-10-16

注意:当我在调试时,我发现直到最后一行,程序运行正常,但是当经过最后一个括号时,会弹出一个错误窗口。我不太熟悉c++,所以找不到问题所在。请帮助!

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
class test {
    public:
        int x;
        void add_list(int);
        void display();
    private:
        vector<int> list;
};
void test::add_list(int op)
{
    list.push_back(op);
}
void test::display()
{
    cout << x << endl;
    for (unsigned int i=0;i<list.size(); i++)
    cout << "->" << list[i];
    cout << endl;
}
int main (void)
{
    test test1;
    test1.x = 3;
    test1.add_list(2);
    test1.add_list(4);
    int size = sizeof (test1);
    ofstream fout ("data.dat", ios_base::binary);
    fout.write((char *)&test1, size);
    fout.close();
    ifstream fin ("data.dat", ios_base::binary);
    test test2;
    fin.read((char *)&test2, size);
    test2.display();
    fin.close();
    return 0;
}

以下几行

fout.write((char *)&test1, size);

fin.read((char *)&test2, size);

不能工作,因为test类包含包含指针的对象。std::list将使用new分配额外的内存来存储推送到它上的项目。然后,它将保留指向这些项的指针。当您将对象写入磁盘时,它仍将包含指向内存的指针。当您再次加载对象时,指针将包含相同的值,但您的程序可能没有分配相同的内存,当然也不会为对象分配内存。

在您的情况下,test2似乎可以工作,因为它的内部指针最终与test1相同,但是当您编程完成时,test1析构函数释放它分配的内存,然后test2析构函数试图释放相同的内存,导致您的错误。

要解决这个问题,你应该修改代码,以一种不使用指针的定义格式来编写对象(例如,写出项目计数,然后是每个项目的整数值)。然后用同样的方法读它们。一个简单的fwrite是做不到的