全部
我定义了一个仅包含数据(不同类型的数据)的类。我也有std :: vector,它包含一个指向此类对象的指针。
类似这样的东西:
class Foo
{
};
class Bar
{
private:
std::vector<Foo *> m_fooVector;
};
在我程序的某个时间点,我想从此向量中删除一个元素。所以我写以下内容:
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it <= m_fooVector.end(); )
{
if( checking it condition is true )
{
delete (*it);
(*it) = NULL;
m_fooVector.erase( it );
}
}
问题是擦除操作失败。当我打开调试器时,我仍然在向量中看到该元素,并且在程序完成时崩溃,因为该元素位于此处的一半。
在另一个函数中,我试图从向量中删除简单的std :: wstring,并且一切正常-删除了string并减小了向量的大小。
这种行为可能是什么问题?我当然可以尝试检查MSVC标准库中的擦除功能,但我什至不知道从哪里开始。
TIA !!!
答案 0 :(得分:2)
您的循环不正确:
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it != m_fooVector.end(); )
{
if (/*checking it condition is true*/)
{
delete *it;
// *it = NULL; // Not needed
it = m_fooVector.erase(it);
} else {
++it;
}
}
传统方法是erase-remove idiom,但是由于您必须先调用delete
(智能指针可以避免此问题),因此您可以使用std::partition
而不是std::remove
:< / p>
auto it = std::partition(m_fooVector.begin(), m_fooVector.end(), ShouldBeKeptFunc);
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it != m_fooVector.end(); ++it) {
delete *it;
}
m_fooVector.erase(it, m_fooVector.end());