2015-07-11 82 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是的,絕對。這就是我想說的,只是所有這些詞都在我的方式:) –