Увеличение сериализации выдает стандартное исключение - PullRequest
3 голосов
/ 13 марта 2012

При тестировании некоторого кода, использующего сериализатор Boost, я обнаружил, что при десериализации сериализации был сгенерирован std :: length_error.Я запускаю код ниже в Linux (в Windows я не видел эту проблему).Я использую Boost 1.47.0.

Мой класс сериализации:

class TestClass
{
public:
    TestClass() {};

    TestClass(const char* string1, const char* string2, const char* string3):
        string1(string1),
        string2(string2),
        string3(string3)
    {};

    template<class Archive>
    void serialize(Archive & archive, const unsigned int version)
    {
        // When the class Archive corresponds to an output archive, the
        // & operator is defined similar to <<.  Likewise, when the class Archive
        // is a type of input archive the & operator is defined similar to >>.
        archive & this->string1;
        archive & this->string2;
        archive & this->string3;
    }

    std::string string1;
    std::string string2;
    std::string string3;
};

Мой тестовый код:

TestClass testClass;
std::string value("nonsense");
try
{
    std::stringstream stringStream;
    stringStream << value;
    boost::archive::text_iarchive serializer(stringStream);
    serializer >> testClass;
}
catch (const boost::archive::archive_exception& e)
{
    ....
}

При выполнении этого кода я получаю std ::length_error:

завершить вызов после выброса экземпляра 'std :: length_error'
what (): basic_string :: resize

Известно ли это (задокументировано)Поведение сериализатора Boost, могу ли я проверить входной поток, чтобы убедиться, что он действителен или в десериализаторе отсутствует попытка / перехват?

С уважением,
Йохан

1 Ответ

0 голосов
/ 21 августа 2013

Вы пишете строку и читаете свой TestClass.

Ваша строка

archive & this->string2;

уже пытается прочитать из неинициализированной памяти.Это означает, что, вероятно, вы пытаетесь выделить std :: string слишком большого размера (в 50% случаев, причем две строки очень похожи, вероятно, каждый раз).

Таким образом, исключение происходит изВаш код и это не удивительно, что это не пойман от архиватора.

...