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?

questionAnswers(1)

yourAnswerToTheQuestion