我正在修改Boost Property Tree,我遇到了this例子。我需要将最终结果转换为vector,所以我在
之后又添加了一行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 :(得分:12)
这失败了:
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());
答案 1 :(得分:0)
sizeof()
没有给出数组的长度,因为c字符串不知道它们的长度(以null结尾)。它只是为数组开头的指针提供内存位置的大小,这就是为什么你可以使用operator []引用超过字符串结尾的原因,如果你不小心的话。
另一个解决方案是重载sizeof以遍历字符串,直到它到达null终止符,但这似乎是你可以用内置的东西做的事情而不需要经过额外的工作。