注意:在我调试时,我发现直到最后一行,程序运行正常,但是当到最后一个括号时,会弹出一个错误窗口。我不太熟悉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;
}
答案 0 :(得分:2)
这些行
fout.write((char *)&test1, size);
和
fin.read((char *)&test2, size);
因为test
类包含包含指针的对象而无法工作。 std::list
将使用new
分配额外的内存来存储推送到它的项目。然后它会保留指向这些项目的指针。将对象写入磁盘时,它仍将包含指向内存的指针。当您再次加载对象时,指针将包含相同的值,但您的程序可能没有分配相同的内存,并且肯定不会为该对象分配它。
在你的情况下test2
似乎有效,因为它的内部指针最终与test1
相同,但是当你编程完成时,test1
析构函数会释放它分配的内存,然后test2
析构函数尝试释放相同的内存,从而导致错误。
要修复它,您应该更改代码,以不使用指针的已定义格式编写对象(例如,写出项目计数后跟每个项目的整数值)。然后以同样的方式阅读它们。一个简单的fwrite无法做到。