首页 > 解决方案 > 对此有编译器警告吗?

问题描述

考虑以下代码片段:

    curve &c = cuts[p.first];
    sort(p.second.begin(),p.second.end(),[&](Point p1, Point p2) {
        return c.ordered(p1,p2);
      });
    if (norm(Point(c.first()) - p.second[0]) > 1)
      cuts.push_back(c.subcurve(c.first(),p.second[0]));
    for (unsigned i = 1 ; i + 2 < p.second.size() ; i += 2)
      cuts.push_back(c.subcurve(p.second[i],p.second[i + 1]));
    if (norm(Point(c.last()) - p.second.back()) > 1)
      c = c.subcurve(p.second.back(),c.last());

这是一小段 OpenCV 代码,重要的是cut曲线向量,而p.first是该向量的索引。为了使代码更具可读性,我替换cuts[p.first]为只是c因为它在正文中被大量使用。

这段代码有问题,这是我不止一次遇到的错误。问题(您可能想先查看代码,看看是否可以找到它)是新元素的推送cuts会使指针无效c

像这样的错误至少应该是模糊的(我为使代码更具可读性而做的事情是合理的)但很难追踪,尤其是在进行随机化或多线程处理的情况下,因为向量被重新分配的点可能会因运行而变化。但这对编译器来说应该是显而易见的,因为您使用的是指向可能被重新分配的内存块的指针。这就是我的问题:有没有办法让编译器在你犯这个错误时警告你?

谢谢!

标签: c++memory-managementstdvector

解决方案


推荐阅读