Stringstream для Vector & lt; char & gt; бросает std :: bad_alloc

Я немного повозился с Boost Property Tree и наткнулся на этот пример. Мне нужно было преобразовать окончательный результат в вектор, поэтому я просто добавил еще одну строку после

write_json(ss, root);

как это:

std::vector<char> testVec(std::begin(ss.str()), std::end(ss.str()));

Я также попробовал это вместо этого:

std::string someString = ss.str()
char* someArray = (char*)someString.c_str();
std::vector<char> someVec(someArray, someArray+sizeof(someArray));

В обоих случаях я получаю эту ошибку:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

Любые намеки, что я делаю не так? Я понимаю, это не проблема дерева свойств. Это проблема преобразования строки в вектор. Я думаю, это имеет смысл, потому что векторы должны быть только одномерными, но я понятия не имею, как преобразовать эту строку в вектор и вернуть ее снова.

0

Решение

Это не удается:

std::vector<char> testVec(std::begin(ss.str()), std::end(ss.str()));

поскольку std::begin() а также std::end() не связаны с тем же std::string пример. ss.str() возвращает новый std::string экземпляр каждый раз, он не возвращает std::string& к некоторому внутреннему члену.

Это неверно:

std::vector<char> someVec(someArray, someArray+sizeof(someArray));

так как sizeof(someArray) является sizeof(char*), Если есть меньше чем sizeof(char*) элементы в someArray будет сделана попытка прочитать память, которая не должна.

Возможное решение:

std::string someString = ss.str();
std::vector<char> someVec(someString.begin(), someString.end());
12

Другие решения

sizeof() не дает вам длину массива, потому что строки c не знают их длины (заканчиваются нулем). Он просто предоставляет размер ячейки памяти для указателя в начале массива, поэтому вы можете ссылаться на конец строки, используя operator [], если вы не будете осторожны.

Другое решение — перегрузить sizeof для итерации по строке, пока она не достигнет нулевого терминатора, но это похоже на то, что вы могли бы сделать со встроенными вещами, не выполняя дополнительную работу.

0