Вопрос выделен жирным шрифтом ниже:
Это прекрасно работает:
void process_batch(
string_vector & v
)
{
training_entry te;
entry_vector sv;
assert(sv.size() == 0);
...
}
Однако это приводит к сбою подтверждения:
void process_batch(
string_vector & v
)
{
entry_vector sv;
training_entry te;
assert(sv.size() == 0);
...
}
Теперь я знаю этопроблема не заключена в термоусадочную пленку, поэтому я ограничу свой вопрос следующим образом: какие условия могут вызвать такую проблему?В частности: инициализация переменной будет повреждена в зависимости от порядка появления в кадре стека.В моем коде нет malloc или free, и нет небезопасных функций, таких как strcpy, memcpy и т.д ... это современный c ++.Используемые компиляторы: gcc и clang.
Для краткости ниже приведены типы
struct line_string
{
boost::uint32_t line_no;
std::string line;
};
typedef std::vector<boost::uint32_t> line_vector;
typedef std::vector<line_vector> entry_vector;
typedef std::vector<line_string> string_vector;
struct training_body
{
boost::uint32_t url_id;
bool relevant;
};
struct training_entry
{
boost::uint32_t session_id;
boost::uint32_t region_id;
std::vector< training_body> urls;
};
ps, я ни в коем случае не говорю, что в компиляторе есть проблема, возможно, этомой кодНо так как я шаблонизирую некоторый код, который я написал давным-давно, проблема поставила меня в тупик, я не знаю, где искать эту проблему.
edit
последовал предложению nim и прошел следующий цикл
- сжимаем код в соответствии с тем, что я здесь показал, скомпилируйте и протестируйте, без проблем.
#if 0
#endif
для сжатия основной программы. - удаление заголовков до тех пор, пока они не будут скомпилированы в сжатой форме.
- удаление ссылок библиотеки до компиляции в сжатой форме.
Решение: удаление ссылки на буферы протокола избавляет от проблемы