При тестировании некоторого кода, использующего сериализатор 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, могу ли я проверить входной поток, чтобы убедиться, что он действителен, или в десериализаторе отсутствует попытка/поймать?
С уважением,
Йохан
string::resize
выдастlength_error
только тогда, когда кто-то попытается сделатьsize()
больше, чемmax_size()
. Это почти невозможно, если только платформа не ограничила размер распределения. - person Bo Persson   schedule 13.03.2012