c++ - 对此有编译器警告吗?
问题描述
考虑以下代码片段:
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
。
像这样的错误至少应该是模糊的(我为使代码更具可读性而做的事情是合理的)但很难追踪,尤其是在进行随机化或多线程处理的情况下,因为向量被重新分配的点可能会因运行而变化。但这对编译器来说应该是显而易见的,因为您使用的是指向可能被重新分配的内存块的指针。这就是我的问题:有没有办法让编译器在你犯这个错误时警告你?
谢谢!
解决方案
推荐阅读
- sql - 仅获取在 A 列中具有相似值而在 B 列中具有不同值的记录
- flutter - 点击 Flutter 后做一个随机动作
- python - 从 Pandas 中的选定列动态创建列
- reactjs - 是的,验证模式对象条件验证
- c++ - 无法使用 MediaInfo.h 库实现 MaxCLL、MaxFall、MasteringDisplayColorPrimaries 参数定义
- regex - 如何使用正则表达式选择/取消选择包含特定单词的多行?
- javascript - 使用 jQuery 将鼠标悬停在两个元素上
- gitlab - Gitlab 管道没有部署的版本
- android - 两个不同的第三方库使用不同版本的同一个库
- apache-kafka - Kafka Connect - 不适用于更新操作