我有一个大型代码库,可以使用boost::any或boost::spirit::hold_any(取决于宏定义)。
hold_any
似乎与boost::any
(例如如何将 boost::any 打印到流?或类型擦除 - 第 IV 部分)兼容并且更快(为什么你不应该使用 boost::any)但我遇到了几个分段错误错误使用hold_any
(提升 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++ 没有成功。
这个例子有什么问题?