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);
这两行改变顺序程序旧崩溃,是什么原因啊?
解决方案
5
你的s持有的是some_value栈顶的地址
当你push之后栈顶的数据就变了,假如它正好不是一个string,就容易出错
不推荐使用boost部分库的原因就是假如你不清楚boost的实现,那很容易出问题
当你push之后栈顶的数据就变了,假如它正好不是一个string,就容易出错
不推荐使用boost部分库的原因就是假如你不清楚boost的实现,那很容易出问题
10
原因应该在于:
vector::push_back操作可能会导致原有迭代器、数据应用失效!假如vector在push_back的时候空间不足,它就会重新分配一块更大的空间,然后把原来的数据复制过来,s是原来空间的一个对象的引用:
vector::push_back操作可能会导致原有迭代器、数据应用失效!假如vector在push_back的时候空间不足,它就会重新分配一块更大的空间,然后把原来的数据复制过来,s是原来空间的一个对象的引用:
原因应该在于:
vector::push_back操作可能会导致原有迭代器、数据应用失效!假如vector在push_back的时候空间不足,它就会重新分配一块更大的空间,然后把原来的数据复制过来,s是原来空间的一个对象的引用,但现在那块空间可能已经不存在了。
++