Stringstream to Vector <char> throws std :: bad_alloc </char>

时间:2012-09-04 15:55:52

标签: c++ vector stringstream

我正在修改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

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

2 个答案:

答案 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 []引用超过字符串结尾的原因,如果你不小心的话。

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