【发布时间】:2014-06-05 16:44:40
【问题描述】:
我的代码库很大,可以使用boost::any 或boost::spirit::hold_any(取决于宏定义)。
hold_any 似乎与boost::any 兼容(例如How to print boost::any to a stream? 或Type erasure - Part IV)并且速度更快(Why you shouldn’t use boost::any),但我在使用hold_any(Boost v1.55 / 1.54 / 1.53)。
这是一个最小的工作示例,显示与原始代码相同的问题:
#include <iostream>
#include <string>
#include <vector>
#include <boost/spirit/home/support/detail/hold_any.hpp>
typedef boost::spirit::hold_any any;
typedef std::vector<any> vany;
int main()
{
vany data0, data1;
for (unsigned i(0); i < 1000; ++i)
{
std::string s("test_test_test");
data0.push_back(any(s));
}
const unsigned n(data0.size());
vany::iterator iter(data0.begin());
for (unsigned i(0); i < n; ++i)
{
std::cout << "Moving " << i << std::endl;
data1.push_back(*iter);
iter = data0.erase(iter);
}
return 0;
}
程序似乎运行正常:
- 从
boost::spirit::hold_any更改为boost::any; - 将
hold_any的内容更改为足够小的数据类型以执行小缓冲区优化(例如,从std::string到int)。
在 Boost Spirit 等广泛使用的库中可能存在一些重大错误似乎很奇怪,但是
- 我很难找到示例中的错误;
- 我试过 g++/clang++ 没有成功。
这个例子有什么问题?
【问题讨论】:
标签: c++ boost boost-spirit memory-corruption boost-any