Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个向量迭代器不能递增?_C++_Memory Management_Vector_Iterator - Fatal编程技术网

C++ 为什么这个向量迭代器不能递增?

C++ 为什么这个向量迭代器不能递增?,c++,memory-management,vector,iterator,C++,Memory Management,Vector,Iterator,我试图删除向量的内容,但得到一个错误-向量迭代器不可递增,为什么 这是我的析构函数: City::~City() { vector <Base*>::iterator deleteIterator; for (deleteIterator = m_basesVector.begin() ; deleteIterator != m_basesVector.end() ; deleteIterator++) m_basesVector.erase(dele

我试图删除向量的内容,但得到一个错误-向量迭代器不可递增,为什么

这是我的析构函数:

City::~City()
{
    vector <Base*>::iterator deleteIterator;
    for (deleteIterator = m_basesVector.begin() ; deleteIterator != m_basesVector.end() ; deleteIterator++)
        m_basesVector.erase(deleteIterator);
}  
City::~City()
{
向量::迭代器deleteIterator;
对于(deleteIterator=m_basesVector.begin();deleteIterator!=m_basesVector.end();deleteIterator++)
m_basesVector.erase(删除迭代器);
}  

谢谢。

删除使迭代器无效。你不能再使用它了。幸运的是,它返回一个迭代器,您可以使用:

vector <Base*>::iterator deleteIterator = m_basesVector.begin();
while (deleteIterator != m_basesVector.end()) {
    deleteIterator = m_basesVector.erase(deleteIterator);
}

您是否负责释放向量中指针引用的内存?如果这就是您进行迭代的原因(并且您的实际程序有更多未显示的代码,这将释放循环中的对象),那么请记住,从向量的开头删除是一个缓慢的操作,因为在每一步中,向量的所有元素都必须向下移动一个位置。最好是在向量上循环,释放所有内容(然后
clear()
向量,尽管正如Mike所说,如果向量是正在被破坏的对象的成员,这是不必要的)。

问题是,在使用erase()函数时,您试图使用迭代器。erase()、push_back()、insert()和其他修改函数使STL中的迭代器无效

只需使用clear()函数:

City::~City()
{
    m_basesVector.clear();
}  

向量迭代器是可递增的,但如果删除元素,向量内容将被修改,因此迭代器无效


因此,如果删除对象,则应使用返回值
erase()
,该值提供下一个有效迭代器。

当调用向量的erase方法时,指向已删除元素或已删除元素之后的元素的任何迭代器都将失效。Erase方法返回指向向量中下一个元素的有效迭代器。您应该使用该迭代器继续循环&而不是递增无效迭代器。也可以使用“清除”方法删除向量中的所有元素。但是,您需要记住为元素显式取消分配任何分配的内存。

如果您试图释放向量中的数据,请执行以下操作:

for (std::vector<Base*>::iterator it = v.begin(), e = b.end(); it != e; ++it) 
    delete *it;
for(std::vector::iterator it=v.begin(),e=b.end();it!=e;++it)
删除*它;

此代码泄漏向量的所有内容-您也必须
删除循环中的*deleteIterator
。您可以通过使用
Base
而不是
Base*
作为
vector
内容来避免所有这些,然后
clear()
将为您销毁它们。或者使用
boost::ptr_vector
,如果您确实需要原始指针,它会自动销毁


如果
向量
很大,则在这样的正向迭代中调用
erase()
可能会非常昂贵,因为当前位置上方的每个元素都必须向下移动,以确保元素保持连续。出于这一原因和其他原因,避免手动擦除您建议的类型。

发布此消息,以防其他人有此问题,并尝试此解决方案,但不知道为什么不起作用。这里有一个实际的解决方案/解释

@Steve Jessop-您的代码有缺陷,您也在这里编写了它。。。(我还编辑了他的帖子,以便在该帖子获得批准后立即修复该问题,该问题将在原始帖子中修复)

我不认为这是一个问题的“解决方案”,当它通过一个无休止的循环创建一个新问题时,while循环中应该有一个deleteIterator++以便它实际到达向量的末尾

我也遇到了这个问题,我的解决方案是在while循环中检查迭代器是否等于end,或者向量大小是否为0,并在尝试递增迭代器之前中断

std::vector::iterator Rank_IT=CurrentPlayers.begin();
while(Rank_IT!=CurrentPlayers.end())
{    
RankPlayer*SelPlayer=(*Rank_IT);
if(strstr(SelPlayer->GamerTag,this->GamerTag)!=NULL)
{
删除[]SelPlayer->PlayerData;
删除[]SelPlayer;
Rank_IT=当前玩家。擦除(Rank_IT);
}
如果(Rank_IT==CurrentPlayers.end()| | CurrentPlayers.size()==0)
{
打破
}
++排名;
}

这与上面发布的原始问题无关,但谷歌搜索错误会将我带到该页面,因此我将其发布在这里,供任何人查看

我最近遇到了这个错误消息,所有代码行都被检出(没有“擦除”或类似的内容;向量只是被读取)

最后,我意识到嵌套循环存在问题

例如,考虑这样的事情:

`for (it=begin(); it!=end();i++)
{
    for (; it!=end();i++)
    {
    }
}`
当您完成嵌套循环时,它将增加迭代器-然后,父循环将再次增加它(!),最终使迭代器步骤结束()。也就是说,如果有这样的事情,它将是“end()+1”。 因此,父循环在下一次检查时抛出此错误

为了解决这个问题,我在子循环之后插入了这一行:

`if (it == vStringList.end()) --it;`
脏,但工作:D


我知道这对某些人来说可能是显而易见的,但我对此挠头已经有一段时间了,哈哈

嗯,它们是否使迭代器无效取决于容器类型。@Matt,这与使用向量无关。@Matt:
erase
将始终使引用已删除元素的迭代器无效。另一个潜在问题是,如果有必要,使用clear()在从向量中删除指针之前不会删除它们。@Matt:
erase()也不会
。假设
m_basesVector
City
的成员,则无需删除其元素;它的析构函数即将为您执行此操作。您知道这不会删除指针指向的对象。您必须调用
delete de
`for (it=begin(); it!=end();i++)
{
    for (; it!=end();i++)
    {
    }
}`
`if (it == vStringList.end()) --it;`