【问题标题】:std::vector Erase - does it de-allocate automatically?std::vector Erase - 它会自动取消分配吗?
【发布时间】:2013-03-22 11:08:54
【问题描述】:

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

  std::vector<RSAddress *> 

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

我的问题是,在调用 mKnownRSList 上的擦除函数后,我是否应该取消分配 std::remove_if 返回的迭代器所指向的地址。目前,我在最后一个被取消引用的迭代器上明确发出删除调用。您认为这种方法正确吗?谢谢。

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

【问题讨论】:

    标签: c++ stdvector


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您认为这种方法正确吗?

      不。正确的方法是使用像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()
      );
      

      【讨论】:

      • 我会第二次 borisbn。这是最安全的方法。
      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 2017-03-04
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多