Boost logo

Boost :

From: Vladimir Prus (ghost_at_[hidden])
Date: 2004-04-14 05:38:10


Robert,
if you recall, all wide archive tests were failing for me. They still failed
with #18, and now I finally (after quite some debugging) know why.

The error I was getting was:

    Exception in "call_test_main": std::length_error: basic_string::reserve

It occured even on test_vector, which is fairly simple. The generated data
contained this:

    22 boost::serialization ....

note that this was for wide archive, where the data should have being in UCS-4
encoding, i.e. ('2' <zero> <zero> <zero> '2' ...)

The reason, once found, is simple:

   {
        test_ostream os(testfile, TEST_STREAM_FLAGS);
        test_oarchive oa(os);
    }

You change codecvt in archive constructors and the archive also has locale
saver. The destructor for archive is called *before* destructor for 'os'. At
this time, codecvt is switched back, right? So, when destructor of 'os' calls
'close' which flushes the data, you're using default codecvt.

If I add explicit 'os.close()' after writing to archive, the written data is
correct.

What this means is that destructor of archive *really should* call 'flush' on
the stream. After I've made basic_text_oprimitive's destructor to flush
stream:

    template<class OStream>
    basic_text_oprimitive<OStream>::~basic_text_oprimitive(){
       os.flush();
    }

The test_vector passed with wide stream. I'm rerunning other tests now.

In fact, I'm getting suspicious about changing codecvt at all. I suppose that
if somebody is using wide streams, he already deals with encoding somehow, so
why serialization library should try to second-guess the user?

- Volodya


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk