boost :: spirit :: hold_any corrupção de memória
Eu tenho uma grande base de código que pode usarboost :: any ouboost :: spirit :: hold_any (dependendo de uma definição de macro).
hold_any
parece ser compatível comboost::any
(por exemplo.Como imprimir boost :: any para um stream? ouEliminação de tipo - Parte IV) e mais rápido (Por que você não deve usar o boost :: any), mas estou com vários erros de falha de segmentação usandohold_any
(Boost v1.55 / 1.54 / 1.53).
Este é um exemplo de trabalho mínimo que exibe o mesmo problema que o 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;
}
O programa parece funcionar corretamente:
mudando deboost::spirit::hold_any
paraboost::any
;alterar o conteúdo dohold_any
para um tipo de dados pequeno o suficiente para executar uma otimização pequena do buffer (por exemplo, destd::string
paraint
)Parece estranho que possa haver algum erro importante em uma biblioteca amplamente usada, como o Boost Spirit, mas
Estou com dificuldade para encontrar um bug no exemplo;Eu tentei g ++ / clang ++ sem sucesso.O que há de errado com o exemplo?