我调用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();