diff --git a/include/msgpack/v1/adaptor/vector.hpp b/include/msgpack/v1/adaptor/vector.hpp index b4b494d0..adf7747c 100644 --- a/include/msgpack/v1/adaptor/vector.hpp +++ b/include/msgpack/v1/adaptor/vector.hpp @@ -51,15 +51,29 @@ template struct convert > { msgpack::object const& operator()(msgpack::object const& o, std::vector& v) const { if (o.type != msgpack::type::ARRAY) { THROW msgpack::type_error(); } - v.resize(o.via.array.size); + bool target_size = v.size(); + // On one occasion resizing an empty vector caused it to overwrite + // the object array itself with NIL objects, so now we try to use + // reserve, and only resize down. + if (target_size <= o.via.array.size) { + v.reserve(o.via.array.size); + } else { + v.resize(o.via.array.size); + } if (o.via.array.size > 0) { msgpack::object* p = o.via.array.ptr; msgpack::object* const pend = o.via.array.ptr + o.via.array.size; - typename std::vector::iterator it = v.begin(); + size_t i = 0; do { - p->convert(*it); + if (i >= target_size) { + T item; + p->convert(item); + v.push_back(item); + } else { + p->convert(v[i]); + } + ++i; ++p; - ++it; } while(p < pend); } return o;