-1

我正在对 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

任何提示我做错了什么?我认为这不是属性树的问题。这是字符串到向量转换的问题。我想这是有道理的,因为向量应该只是一维的,但我不知道如何将该字符串转换为向量并再次将其取回。

4

2 回答 2

13

这失败了:

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

因为std::begin()andstd::end()没有与同一个std::string实例相关联。每次ss.str()返回一个新的实例,它不会返回一个到某个内部成员。std::stringstd::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());
于 2012-09-04T15:59:42.740 回答
0

sizeof()没有给你数组的长度,因为 c 字符串不知道它们的长度(以空结尾)。它只是为数组开头的指针提供内存位置的大小,这就是为什么如果你不小心,你可以使用 operator[] 引用字符串的结尾。

另一种解决方案是重载 sizeof 以遍历字符串,直到它到达空终止符,但这似乎是你可以用内置的东西做的事情,而无需经过额外的工作。

于 2012-09-04T16:03:37.297 回答