stl vector中成员对象的删除

 我调用vector中erase方法,删除其成员,遇见一个诡异的现象,似乎它只能删除偶数序号索引的数据。
 代码入下,

#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
class Client
{
public:
    Client(int32_t i):m_index(i){}
    ~Client(){printf("destruct client %d\n",m_index);}
    int32_t GetIndex(){return m_index;}
private:
    int32_t m_index;
};
static int num=10;
int main()
{
    int i=0;
    std::vector<Client*> m_clients;
    std::map<int,Client*>m_paths;
    for(i=0;i<num;i++)
    {
        Client *client=new Client(i);
        m_clients.push_back(client);
    }
    Client *ptr=nullptr;
    for(auto it=m_clients.begin();it!=m_clients.end();it++)
    {
         ptr=*it;
         *it=nullptr;
         m_clients.erase(it);
        printf("%d\n",ptr->GetIndex());
         delete ptr;

    }
   // m_clients.clear();
   ptr=m_clients[3];
   if(ptr==nullptr)
   {
       printf("thats right\n");
   }
    printf("just for some test%d\n",m_clients.size());
}

 stl_vecotr.h中的erase的实现如下

  iterator erase(iterator __position) {
    if (__position + 1 != end())
      copy(__position + 1, _M_finish, __position);
    --_M_finish;
    destroy(_M_finish);
    return __position;
  }

 这是因为,erase方法的中的对象拷贝引起的。就是删除了当前位置的元素,但是下个元素被复制到当前位置position。这就导致上述现象,vecto中的元素只被删除可一半。
 需要全部清除vector中的元素的时候,可以这样:

    for(auto it=m_clients.begin();it!=m_clients.end();)
    {
         ptr=*it;
         *it=nullptr;
         m_clients.erase(it);
        printf("%d\n",ptr->GetIndex());
         delete ptr;
    }

 或者不调用erase:

    for(auto it=m_clients.begin();it!=m_clients.end();it++)
    {
         ptr=*it;
         *it=nullptr;
        printf("%d\n",ptr->GetIndex());
         delete ptr;
    }
    m_clients.clear();

猜你喜欢

转载自blog.csdn.net/u010643777/article/details/80332149