boost :: spirit :: hold_any corrupción de memoria
Tengo una base de código grande que puede usarboost :: any oimpulso :: espíritu :: hold_any (dependiendo de una definición macro).
hold_any
parece ser compatible conboost::any
(p.ej.¿Cómo imprimir boost :: any a una secuencia? oTipo de borrado - Parte IV) y más rápido (Por qué no deberías usar boost :: any) pero estoy experimentando varios errores de segmentación usandohold_any
(Boost v1.55 / 1.54 / 1.53).
Este es un ejemplo de trabajo mínimo que exhibe el mismo problema que el código original:
#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;
}
El programa parece funcionar correctamente:
cambiando deboost::spirit::hold_any
aboost::any
;cambiando el contenido de lahold_any
a un tipo de datos lo suficientemente pequeño como para realizar una pequeña optimización del búfer (por ejemplo, destd::string
aint
)Parece extraño que pueda haber algún error importante en una biblioteca ampliamente utilizada como Boost Spirit, pero
Me está costando encontrar un error en el ejemplo;He intentado g ++ / clang ++ sin éxito.¿Qué tiene de malo el ejemplo?