vector>遇到奇怪的有关问题,一push_back后,以前记录下来的shared_ptr都失效了,怎么处理

vector<shared_ptr<cls>>遇到奇怪的问题,一push_back后,以前记录下来的shared_ptr都失效了,怎么办

vector<shared_ptr<cls>>遇到奇怪的问题,一push_back后,以前记录下来的shared_ptr都失效了,怎么办

#include <vector>
#include <set>
#include <iostream>
#include <algorithm>
#include <boost/shared_ptr.hpp>

using namespace std;
using namespace boost;template <typename T>
T& GetLast(vector<T> &v)
{
int size=v.size();
return v[size-1];
}

class cls
{
public:

int a;
int b;
cls()
{
a=1;
b=2;
}
};

vector<shared_ptr<cls>> g_v;
int g_a=10,g_b=20;

void SelectItem(int d)
{
shared_ptr<cls> &p=*(shared_ptr<cls> *)d;
cout<<p->a<<" "<<p->b;

}
int add()
{
shared_ptr<cls> p(new cls);
p->a=g_a;
p->b=g_b;
g_v.push_back(p);
return (int)&GetLast(g_v);
}


int _tmain(int argc, _TCHAR* argv[])
{
int v0=add();

g_a=11,g_b=21;
int v1=add();

g_a++,g_b++;
int v2=add();


g_a++,g_b++;
int v3=add();
SelectItem(v3);//ok
SelectItem(v2);//error!


return 0;
}


------解决方案--------------------
哎,楼主啊,换list吧。
然后去找本《effective stl》认真啃一啃吧。貌似就在第一个item吧。
------解决方案--------------------
主楼的程序写的可真是够烂的.
anyway,错误的原因在于你直接记录了 vector 中元素的地址 (return (int)&GetLast(g_v);),而当std::vector::push_back时,需要增长向量长度,这是会导致重新分配内存,所有以前记录的元素地址就都失效了.再次使用的时候就出错了.另外 int 的大小在 64 位系统上放不下指针.
------解决方案--------------------
g_v.reserve(10000);// 预分配10000个元素的内存(10000元素内不用重新分配内存)