vector Erase -是否自动取消分配

std::vector Erase - does it de-allocate automatically?

本文关键字:取消 分配 是否 Erase vector      更新时间:2023-10-16

下面的代码mKnownRSList的类型为:

  std::vector<RSAddress *> 

其中RSAddress是我写的类。函数op removeItem从vector中移除一个元素。

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

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;
}

首先应该删除容器内部指针指向的对象,然后再从容器中删除实际指针。

你在这里做的是对一个指向不再存在的对象的迭代器解引用。

你认为这种方法正确吗?

不。正确的方法是使用像shared_ptr这样的smart_pointer。如果你愿意,那么你应该只做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()
);