再現できない1回のアサーションエラーが発生したC++アプリケーションがあります。一度失敗したコードは次のとおりです。
unsigned int test(std::vector<CAction> actionQueue) {
unsigned int theLastCount = actionQueue.size() - 1;
std::vector<CAction>::const_reverse_iterator rItr = actionQueue.rbegin();
std::vector<CAction>::const_reverse_iterator rEndItr = actionQueue.rend();
for (; rItr != rEndItr; ++rItr, --theLastCount) {
const CAction &fileAction = *rItr;
if (fileAction.test()) {
continue;
}
return theLastCount;
}
assert(theLastCount == 0); // How could this fail?
return theLastCount;
}
どういうわけか、ループが完了した後、LastCountはゼロではありませんでした。
私がロジックを読んだところ、次の場合を除いて、これは不可能なはずです。
- 他のスレッドの側面がactionQueueに影響を及ぼしました(これは可能ではないと思います)。
- 一時的なメモリの破損が発生しました。
ここで愚かなことを見逃していますか?表示されているコードにバグがありますか?これを見た場合、ベクトルには2つの要素があるため、LastCountは1に初期化されているはずです。