Boost logo

Boost Users :

From: Robert Ramey (ramey_at_[hidden])
Date: 2006-03-13 21:37:40


I suspect this is an issue related to the closing and flushing of file
streams.

Without yuor {} the output archive and stream aren't getting flushed and
closed.

So in an example like this you have to use the brackets to be sure that
the appropriate destructors get called.

Robert Ramey

Robert S. Grimes wrote:
> Hi all,
>
> It seems there is a problem with using both an output and an input
> archive in the same code block. Here is a simple sample that
> illustrates the problem. By defining the symbol BREAK_IT, you can
> see the problem; not defining it, the example works. What is
> particularly odd is that it is throwing an std::bad_alloc from within
> text_iarchive_impl<Archive>::load(std::string &s) in
> text_iarchive_impl.ipp because the requested size is obviously wrong
> - for example, 3435973837!!! I can't follow well enough what is
> happening, but I have figured out a work-around from noticing the
> differences between my example and demo.cpp; in the latter, the
> writing and reading of an archive are performed in two separate
> functions, or more precisely, two different blocks. Is this normal?
> Have I missed the documentation about this? Still, seems rather
> fussy, though to be honest, I'm not likely to suffer from the
> workaround in "production" code, but it's a bit unnerving
> nonetheless...
>
> Thanks!
> -Bob
>
> Example follows:
>
> #include <fstream>
> #include <iostream>
> #include <string>
>
> #include <boost/archive/text_iarchive.hpp>
> #include <boost/archive/text_oarchive.hpp>
>
> class Simple
> {
> private:
> int anIntMember;
> bool aBoolMember;
>
> template<class Archive>
> void serialize(Archive & ar, const unsigned int file_version)
> {
> ar & BOOST_SERIALIZATION_NVP(anIntMember)
> & BOOST_SERIALIZATION_NVP(aBoolMember);
> }
>
> // Grant access to serialization library
> friend class boost::serialization::access;
>
> public:
> Simple(): anIntMember(27), aBoolMember(false) {}
> int GetAnIntMember() const { return anIntMember; }
> void SetAnIntMember(int v) { anIntMember = v; }
> bool GetABoolMember() const { return aBoolMember; }
> void SetABoolMember(bool v) { aBoolMember = v; }
> };
>
> #define BREAK_IT
>
> void TestBoostText(const Simple& parms)
> {
> #ifndef BREAK_IT
> {
> #endif
> // Write out to boost archive
> std::ofstream ofs("./boost.txt");
> boost::archive::text_oarchive oa(ofs);
> oa << parms; /// Could use a better XML element name
> #ifndef BREAK_IT
> }
> #endif
>
> // Read it back and check
> Simple rparms;
> std::ifstream ifs("./boost.txt"); // THIS IS THE BROKEN LINE
> boost::archive::text_iarchive ia(ifs);
> ia >> rparms;
> std::cout << "Checking boost read...";
> if (rparms.GetAnIntMember() == 99) {
> std::cout << "Worked!!!" << std::endl;
> } else {
> std::cout << "Failed - appears not to have been updated" <<
> std::endl; }
> }
>
> int main(int argc, char* argv[])
> {
> Simple parms;
>
> // Modify parms for testing purposes
> parms.SetAnIntMember(99);
>
> // Test both binary archives
> TestBoostText(parms);
>
> return 0;
> }


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net