2005-08-03 12:24:51 amdfanatyk napisał:
> jednak jest problem

>
> //mam jakas tam klase np
> CKlasa * data = new CKlasa;
> // ma ona zmienne w sekcji prywatnej i akcesory w publicznej
>
> // i funkcje do zapisu
> QFile * fout = new QFile(dir.path() + "/data");
>
> fout->open(IO_WriteOnly);
> fout->writeBlock((char *)data, sizeof(*data));
> fout->close();
>
> delete fout;
>
> -----------------------------------------------
>
> CKlasa * data = new CKlasa;
>
> // i odczytu danych
>
> QFile * fin = new QFile(dir.path() + "/data");
>
> fin->open(IO_ReadOnly);
> fin->readBlock((char *)data, sizeof(*data));
> fin->close();
>
> delete fin
>
> gdy w programie najpierw zapisze dane do pliku pierwsza funkcja i odczytam druga to jest ok ale
> gdy zamkne program i przerobie kod tak, ze funkcja zapisujaca jest wykomentowana i uruchamia sie
> tylko ta, ktora czyta dane, to dostaje komunikaty typu:
>
> QGArray: Cannot allocate array with negative length
> Naruszenie ochrony pamięci
>
> terminate called after throwing an instance of 'std::bad_alloc'
> what(): St9bad_alloc
> Przerwane
>
> i generealnie naruszenie ochrony pamieci :[ nie rozumiem w czym tu jest problem

(((
Nigdy nie bawiłem się w zapis binarny do pliku w C++. Wydaje mi się jednak, że skoro używasz sizeof( *data );, a wielkość klasy uległa zmianie (wykasowałeś jedną metodę), to może odczyt jest nieudany, bo w pliku nie natrafiamy na egzemplarz IDENTYCZNEJ klasy, tylko takiej, która jest mniejsza o jedną metodę.
To jest właśnie wada zapisu obiektów binarnie, każda zmiana (wystarczy zmienić typ dowolnej składowej, najwyraźniej metody też są na to podatne), a od razu dyskwalifikuje odczyt z pliku.
Ale - jak już mowiłem - nie testowałem zapisu binarnego w C++, a jedynie w C i nie mam pewności czy w ogóle zapis adresów metod występuje w pliku binarnym.