问题在下面以粗体显示:
这工作正常:
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,我绝不是说编译器有问题,可能是我的代码。但是由于我正在模板化我很久以前编写的一些代码,这个问题让我完全难住了,我不知道在哪里可以找到问题所在。
编辑
遵循 nim 的建议并经历了以下循环
- 将代码收缩包装到我在这里显示的内容,编译和测试,没问题。
#if 0
#endif
收缩包装主程序。- 删除标题,直到它以收缩包装的形式编译。
- 删除库链接,直到以收缩包装形式编译。
解决方案:删除到协议缓冲区的链接可以解决问题