【发布时间】:2012-06-28 23:31:41
【问题描述】:
我有一段代码在运行时因各种奇怪的内存损坏而失败。我已将其范围缩小到这部分代码:
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;
}
如果我从 lambda 中删除 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,而不是 boost。
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);
}
这个问题有很多问题。抱歉,我会尝试制作一个较小的测试用例。
更新:
将Poly::center 中对sum 的调用替换为std::accumulate 没有帮助。
【问题讨论】:
-
PolyF::center是什么样的?它对 const 对象和非 const 对象的操作是否不同?它是否尝试将结果缓存在对象中? -
将相关代码添加到帖子中。
-
很明显你打电话的
sort不是std::sort,那是什么? -
比较器是否可能存在浮点精度问题?如果由于舍入错误,比较器不是严格的弱顺序(比如说它报告 asortCenter 的距离几乎完全相等,则可能会发生这种情况
-
甚至更多,如果您在
reduce中对res的默认初始化与对其进行零初始化不同。我以前遇到过这个问题,这可能取决于您对Vec2f的实现
标签: c++ lambda c++11 g++ segmentation-fault