boost下std::string输出问题

tauke_wang 2016-06-21 07:32:13

int main()
{
std::vector<boost::any> some_value;
some_value.push_back(10);
const char* szStr = "Holle Word!";
some_value.push_back(szStr);
some_value.push_back(std::string("Wow!"));

std::string& s = boost::any_cast<std::string&>(some_value.back());
s += " This is great!";
std::cout << boost::any_cast<std::string&>(some_value.back()).c_str() << std::endl;

std::cout << s.c_str() << std::endl;

some_value.push_back(1.1f);

std::for_each(some_value.begin(), some_value.end(), doType());

return 0;
}


这个代码中的
std::cout << s.c_str() << std::endl;
some_value.push_back(1.1f);
这两行改变顺序程序旧崩溃,是什么原因啊?
...全文
263 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tauke_wang 2016-08-04
  • 打赏
  • 举报
回复
确实是vector中采用了引用,在下次pusk_back时vector的地址可能发生了改变导致的,如果把s的引用去掉就可以了,谢谢各位
小类人猿 2016-06-21
  • 打赏
  • 举报
回复
引用 3 楼 lunat 的回复:
原因应该在于: vector::push_back操作可能会导致原有迭代器、数据应用失效!如果vector在push_back的时候空间不足,它就会重新分配一块更大的空间,然后把原来的数据复制过来,s是原来空间的一个对象的引用,但现在那块空间可能已经不存在了。
++
lunat 2016-06-21
  • 打赏
  • 举报
回复
引用 3 楼 lunat 的回复:
原因应该在于: vector::push_back操作可能会导致原有迭代器、数据应用失效!如果vector在push_back的时候空间不足,它就会重新分配一块更大的空间,然后把原来的数据复制过来,s是原来空间的一个对象的引用,但现在那块空间可能已经不存在了。
数据引用。
lunat 2016-06-21
  • 打赏
  • 举报
回复
原因应该在于: vector::push_back操作可能会导致原有迭代器、数据应用失效!如果vector在push_back的时候空间不足,它就会重新分配一块更大的空间,然后把原来的数据复制过来,s是原来空间的一个对象的引用,但现在那块空间可能已经不存在了。
yshuise 2016-06-21
  • 打赏
  • 举报
回复
可以直接用std::string;
ID870177103 2016-06-21
  • 打赏
  • 举报
回复
你的s持有的是some_value栈顶的地址 当你push之后栈顶的数据就变了,如果它正好不是一个string,就容易出错 不推荐使用boost部分库的原因就是如果你不清楚boost的实现,那很容易出问题

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧