2014-10-28 85 views
1

剛開始使用C++。從文件讀取時發生C++訪問衝突

我從二進制文件讀取時遇到訪問衝突錯誤。這裏所涉及的類:

class Staff { //base class 
public: 
    Staff() {} 
    virtual ~Staff{} 
} 

一個派生類:

class Scheduler : public Staff { 
public: 
    Scheduler() {} 
    //no destructor defined 
} 

然後在代碼中使用這些類:

ifstream in("Scheduler.dat", ios::in | ios::binary); 
Scheduler s; 
in.read(reinterpret_cast<char *>(&s), sizeof(Scheduler)); 

我打的讀聲明的那一刻,訪問衝突異常觸發器,VS2013指向Staff類中的虛擬析構函數。

是否因爲我沒有在類Scheduler中顯式創建析構函數?或者是由其他事物引起的?

回答

5

Scheduler不是一個可以複製的類,你不能從這個字節讀取或寫入它。

http://en.cppreference.com/w/cpp/types/is_trivially_copyable

甲平凡能夠複製類是一類

  1. 已經沒有非平凡複製構造(這也需要沒有虛函數或虛擬鹼基
  2. 已經沒有非平凡移動構造函數
  3. 沒有非平凡的複製賦值運算符
  4. 已經沒有了不平凡的舉動賦值運算符
  5. 擁有一個平凡的析構函數

你要麼必須刪除虛析構函數(這帶來了自己的一系列問題,如果你想使用多態Staff ),使用序列化庫讀取或寫入文件,或者編寫自己的序列化函數,規範的方式將類似於std::ostream& operator<<(std::ostream&, Staff const&);

+0

我可以將調度程序對象寫入該文件,但它只發生在讀取 – user2990428 2014-10-28 10:17:40

+0

@ user2990428未定義d行爲並不一定意味着你的程序會崩潰。 'Scheduler'的vtable是在運行時設置的,每次運行程序時都不太一樣。 – user657267 2014-10-28 10:20:08