Eclipse调试器中vector.size()执行push_back后未更新问题求助
先看你的核心代码片段:
for (int j = 0; j < superpixels[orgIndex].size(); j++) { superpixels[dstIndex].push_back(superpixels[orgIndex][j]); } superpixels[orgIndex].clear(); std::vector<int>().swap(superpixels[orgIndex]);
你说执行push_back后Eclipse调试器显示superpixels[dstIndex].size()没变化,结合初始情况orgIndex=1、dstIndex=287,我整理了几个最可能的排查方向:
目标容器的索引是否合法?
先确认superpixels这个容器的大小是否至少是288(因为索引从0开始,287是第288个元素)。如果superpixels的size小于等于287,那superpixels[dstIndex]会触发未定义行为——你可能在访问一个不存在的vector,此时push_back的操作根本不会作用到你期望的容器上,甚至可能破坏内存导致调试器显示异常。调试器的显示是否有延迟?
Eclipse的调试器有时候会因为缓存或者优化问题,没有实时更新容器的size值。你可以在push_back循环结束后,手动添加一行代码打印superpixels[dstIndex].size():std::cout << "dst size after push: " << superpixels[dstIndex].size() << std::endl;对比调试器的显示和控制台输出,判断是不是调试器的显示问题。
源容器的初始size是否为0?
你提到执行前的初始情况,但没明确说superpixels[1].size()具体是多少。如果superpixels[1]本身就是空的,那循环根本不会执行,dstIndex对应的vector自然不会有变化。可以在循环前打印superpixels[orgIndex].size()确认这点。是否存在多线程竞争?
如果这段代码是在多线程环境下执行的,可能有其他线程同时修改superpixels[dstIndex],或者修改了superpixels的结构(比如删除元素),导致你的push_back操作被覆盖或者失效。
另外,给你提个代码优化建议:合并vector不需要手动写循环,直接用insert效率更高:
superpixels[dstIndex].insert(superpixels[dstIndex].end(), superpixels[orgIndex].begin(), superpixels[orgIndex].end()); superpixels[orgIndex].clear(); std::vector<int>().swap(superpixels[orgIndex]);
insert是STL内置的批量插入方法,比手动循环push_back更高效,也能减少手动循环可能出现的错误。
内容的提问来源于stack exchange,提问作者frozenca

