実行中にさまざまな奇妙なメモリ破損で失敗するコードがあります。コードのこのセクションに絞り込みました。
List<CollisionBlock> WorldClient::getCollisionBlocks(RectF const& boundBox, bool doSort, Vec2F sortCenter) const {
auto res = m_collisionGenerator.getPolys(boundBox);
if (doSort) {
sort(res, [=](CollisionBlock const& block1, CollisionBlock const& block2) {
return magSquared(sortCenter - block1.poly.center()) < magSquared(sortCenter - block2.poly.center());
});
}
return res;
}
const&
ラムダからを削除すると、コードは正常に機能します。どうしてか分かりません。コンパイラのバグに遭遇したのか、それとも私が見落としている明らかな何かがあるのかと思っていました。
CollisionBlockの定義は次のとおりです。
struct CollisionBlock {
PolyF poly;
// Will never be None
CollisionKind kind;
// Normalzied vector encoding the slope of the block we collided with.
// Always faces right, y component can be positive or negative.
Vec2F slope;
};
Linux 32ビット(g ++バージョン4.7.0および4.6.3)、MacOSX(ワードサイズとg ++バージョンが不明)、Windows 7 64ビット(g ++バージョン4.6.3)、Windows 7 32ビット(g ++)で再現できます。バージョン4.6.2および4.6.3)、ただしLinux 64ビット(g ++バージョン4.6.1)ではありません。
ブーストではなく、C++11を使用しています。
Poly::center()
Coord center() const {
return sum(m_vertexes) / (DataType)m_vertexes.size();
}
sum
template<typename Container>
typename Container::value_type sum(Container const& cont) {
return reduce(cont, std::plus<typename Container::value_type>());
}
reduce
// Somewhat nicer form of std::accumulate
template<typename Container, typename Function>
typename Container::value_type reduce(Container const& l, Function f) {
typename Container::const_iterator i = l.begin();
typename Container::value_type res{};
if (i == l.end())
return res;
res = *i++;
while (i != l.end())
res = f(res, *i++);
return res;
}
sort
template<typename Container, typename Compare>
void sort(Container& c, Compare comp) {
std::sort(c.begin(), c.end(), comp);
}
この質問にはかなりのことが起こっています。申し訳ありませんが、より小さなテストケースを作成してみます。
アップデート:
の呼び出しをsum
に置き換えても効果はPoly::center
ありstd::accumulate
ません。