0

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

  std::vector<RSAddress *> 

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

我的问题是,在调用 mKnownRSList 上的擦除函数后,我是否应该取消分配 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;
}
4

2 回答 2

3

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

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

于 2013-03-22T11:12:32.800 回答
1

您认为这种方法正确吗?

没有。正确的方法是使用 smart_pointers 像shared_ptr。如果你愿意,那么你应该只做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()
);
于 2013-03-22T11:12:05.983 回答