Я немного повозился с 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
Любые намеки, что я делаю не так? Я понимаю, это не проблема дерева свойств. Это проблема преобразования строки в вектор. Я думаю, это имеет смысл, потому что векторы должны быть только одномерными, но я понятия не имею, как преобразовать эту строку в вектор и вернуть ее снова.
Это не удается:
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());
sizeof()
не дает вам длину массива, потому что строки c не знают их длины (заканчиваются нулем). Он просто предоставляет размер ячейки памяти для указателя в начале массива, поэтому вы можете ссылаться на конец строки, используя operator [], если вы не будете осторожны.
Другое решение — перегрузить sizeof для итерации по строке, пока она не достигнет нулевого терминатора, но это похоже на то, что вы могли бы сделать со встроенными вещами, не выполняя дополнительную работу.