2015-07-11 104 views
-6

注:虽然我在调试时,我发现,直到最后一行,程序正常运行,但最后的支架会时,一个错误窗口将弹出。我对C++不太熟悉,所以找不到问题。请帮忙!为什么此cpp程序失败?

#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; 
} 
+2

是什么错误说? – SteveFerg

+0

我们需要知道错误是什么帮助。 – celticminstrel

+4

@HaroldHuang阅读和写这种非POD类型将无法正常工作。您无法使用二进制模式保存或读取这些类型。该对象必须正确序列化。 – PaulMcKenzie

回答

2

这些线

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

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

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

你的情况test2似乎工作,因为它的内部指针最终被作为test1相同,但是当你程序完成时,test1析构函数释放其分配的内存,那么test2析构函数试图释放相同的内存,导致你的错误。

要解决它,你应该改变你的代码写在不使用指针定义格式的对象(例如写出来的项目计数,然后每个项目整数值)。然后以相同的方式阅读它们。一个简单的fwrite将无法做到这一点。

+0

我认为'test1'是确定的,即使'write'后。是的,'write'语句不起作用,但唯一的缺点是该文件将包含垃圾。问题出在'read'的第二行。这是出现问题的地方,因为构造的对象正在被损坏。 – PaulMcKenzie

+0

@PaulMcKenzie是的,绝对。这就是我想说的,只是所有这些词都在我的方式:) –