2013-11-20 34 views
0

我試圖用雙向鏈表來存儲數據。 所以我做了一段時間的聲明,將每個節點都傳遞給存檔。「訪問衝突讀取位置0xcdcdcdfd」序列化時

if (ar.IsStoring()) 
{ 
    while (Actual) 
    { 
     ar << Actual->name; 
     ar << Actual->adresse; 
     ar << Actual->email; 
     ar << Actual->fax; 
     ar << Actual->firma; 
     ar << Actual->geburtsdatum; 
     ar << Actual->geschlecht; 
     ar << Actual->land; 
     ar << Actual->ort; 
     ar << Actual->plz; 
     ar << Actual->telefon; 
     ar << Actual->vorname; 
     Actual = Actual->next; 
    } 
} 

This works。我的問題是加載變量。它是1:1相同。 (而不是< <來>>)。

我alwany得到一個錯誤「訪問衝突讀取位置0xcdcdcdfd」。 我真的不知道爲什麼。 在功能的頂部有Actual = Actual->next;錯誤。

如果你需要它,這是我的全序列化功能:

void CDatenbankDoc::Serialize(CArchive& ar) 
{ 
    Actual = Start; 
    Actual = Actual->next; 
    if (ar.IsStoring()) 
    { 
     while (Actual) 
     { 
      ar << Actual->name; 
      ar << Actual->adresse; 
      ar << Actual->email; 
      ar << Actual->fax; 
      ar << Actual->firma; 
      ar << Actual->geburtsdatum; 
      ar << Actual->geschlecht; 
      ar << Actual->land; 
      ar << Actual->ort; 
      ar << Actual->plz; 
      ar << Actual->telefon; 
      ar << Actual->vorname; 
      Actual = Actual->next; 
     } 
    } 
    else 
    { 
     while (Actual) 
     { 
      ar >> Actual->name; 
      ar >> Actual->adresse; 
      ar >> Actual->email; 
      ar >> Actual->fax; 
      ar >> Actual->firma; 
      ar >> Actual->geburtsdatum; 
      ar >> Actual->geschlecht; 
      ar >> Actual->land; 
      ar >> Actual->ort; 
      ar >> Actual->plz; 
      ar >> Actual->telefon; 
      ar >> Actual->vorname; 
      Actual = Actual->next; 
     } 

    } 
} 

希望你能幫助我解決這個問題。 感謝

+0

串行數據時,永遠不要存儲指針。在反序列化它們時指針不會有意義。另外,千萬不要讓指針未初始化。您需要爲您的「Actual」的c'tor提供代碼。實質上,你甚至不應該在C++中使用指針。 – IInspectable

+0

0xcdcdcdcd是一個神奇的價值,當你得到錯誤的代碼時,它的目的是讓程序崩潰。它告訴你,你正在使用一個已經被刪除的對象。所以Actual-> next是垃圾,而不是創建你反序列化的對象,在代碼中也是一個非常明顯的缺陷。 –

回答

0

讀取數據時,你必須創建一個新的對象在歸檔的每個條目,喜歡的東西:

while (!ar.IsBufferEmpty()) 
{ 
    Actual->next = new TypeOfActual; 
    Actual = Actual->next; 

    ar >> Actual->name; 
    // etc. 
} 
+0

已有一個對象用於 - >下一個 – user2675121

+0

在反序列化之前,必須先創建您反序列化的每個對象。 –

+1

@邁克爾幾乎正確。但是,MFC序列化也建立在通過['DECLARE_DYNCREATE'](http://msdn.microsoft.com/en-us/library/56302tyt.aspx)和朋友實現的MFC類工廠上。如果你想序列化/反序列化複合結構,你應該考慮讓它們動態創建。 – IInspectable