Местоположение чтения нарушения доступа 0xcdcdcdfd при сериализации

Я пытаюсь хранить данные с двусвязными списками. Поэтому я сделал оператор while, который передает каждый узел в архив.

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;
    }
}

Это работает. Моя проблема заключается в загрузке переменных. Это 1:1 то же самое. (Вместо ‹‹ на >>).

Я всегда получаю сообщение об ошибке «Нарушение доступа к месту чтения 0xcdcdcdfd». Я действительно не знаю, почему. Возникла ошибка с Actual = Actual->next; наверху функции.

Если вам это нужно, вот моя полная функция Serialize:

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;
        }

    }
}

Надеюсь, вы поможете мне решить эту проблему. Спасибо


person user2675121    schedule 20.11.2013    source источник
comment
Никогда не сохраняйте указатели при сериализации данных. Указатели не будут иметь смысла при их десериализации. Кроме того, никогда не оставляйте указатели неинициализированными. Вам необходимо предоставить код для c'tor вашего Actual. По сути, вы даже не должны использовать указатели в C++.   -  person IInspectable    schedule 20.11.2013
comment
0xcdcdcdcd — это магическое значение, предназначенное для сбоя вашей программы, если вы ошибетесь в коде. Он говорит вам, что вы используете объект, который уже был удален. Так что Actual-›next — это мусор, отсутствие создания объекта, который вы десериализуете, также является очень заметным недостатком в коде.   -  person Hans Passant    schedule 25.11.2013


Ответы (1)


При чтении вам придется создавать новый объект для каждой записи в архиве, что-то вроде:

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

    ar >> Actual->name;
    // etc.
}
person James Hopkin    schedule 20.11.2013
comment
Каждый объект, который вы десериализуете, должен быть создан до того, как вы сможете его десериализовать. - person Jabberwocky; 20.11.2013