質問は下に太字で示されています:
これは正常に機能します。
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
メインプログラムをシュリンクラップします。- シュリンクラップ形式でコンパイルされるまでヘッダーを削除します。
- シュリンクラップ形式でコンパイルされるまでライブラリリンクを削除します。
解決策:プロトコルバッファへのリンクを削除すると、問題が解消されます