std :: vector Erase - 它会自动解除分配吗?

时间:2013-03-22 11:08:55

标签: c++ stdvector

在下面的代码中, mKnownRSList 的类型为:

  std::vector<RSAddress *> 

其中 RSAddress 是我写的一个类。功能 removeItem 会从此向量中删除项目。

我的问题是,在调用mKnownRSList上的erase函数后,我应该取消分配由std :: remove_if返回的迭代器指向的地址。目前,我在名为last的去引用迭代器上显式发出删除调用。你认为这种方法是否正确?谢谢。

void 
ABC::removeItem(RSAddress * rsAddr)
{
   auto last = 
   std::remove_if(mKnownRSList.begin(),
                  mKnownRSList.end(),
                 [rsAddr]( RSAddress * o )
                 {
                   return (*o == *rsAddr);
                 });

 mKnownRSList.erase(last, mKnownRSList.end());

 delete *last;
}

2 个答案:

答案 0 :(得分:3)

您应该先删除容器首先中指针所指向的内容,然后从容器中删除/删除实际指针。

你在这里做的是取消引用指向不再存在的东西的迭代器。

答案 1 :(得分:1)

  

您认为这种方法是否正确?

不。正确的方法是使用像shared_ptr这样的smart_pointers。如果你愿意,那么你应该erase它。像这样

std::vector< std::shared_ptr< RSAddress  > > mKnownRSList;
...

mKnownRSList.erase( std::remove_if(mKnownRSList.begin(),
                                   mKnownRSList.end(),
                                   [rsAddr]( const std::shared_ptr< RSAddress > & o )
                                   {
                                       return (*o == *rsAddr);
                                   }),
                    mKnownRSList.end()
);