0

以下のコードでは、 mKnownRSListのタイプは次のとおりです。

  std::vector<RSAddress *> 

ここで、RSAddressは私が作成したクラスです。functionop 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;
}
4

2 に答える 2

3

最初にコンテナー内のポインターが指すものを削除してから、コンテナーから実際のポインターを削除/消去する必要があります。

ここで行っているのは、もはや存在しないものを指す反復子を逆参照することです。

于 2013-03-22T11:12:32.800 に答える
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()
);
于 2013-03-22T11:12:05.983 に答える