vector释放有关问题

vector<Pointer*>释放问题
大家好!

我现在有两个vector,都是vector<Pointer*>Pt1,Pt2,他们之间有共同的指针,还有不同的部分,

Pointer* tmp = new Pointer();
Pt1.push_back(tmp );
............
中间有Pt2.push_back(Pt1[k]);

删除的时候,我是这么处理的

for ( vector<Pointer*>::iterator Tempit = Pt1.begin();Tempit != Pt1.end(); Tempit++ )
{
if( *Tempit != NULL )
{
delete *Tempit;
*Tempit = NULL;
  }
}

for ( vector<Pointer*>::iterator Tempit = Pt2.begin();Tempit != Pt2.end(); Tempit++ )
{
if( *Tempit != NULL )
{
delete *Tempit;
*Tempit = NULL;
  }
}
结果出现崩溃,求指点

------解决方案--------------------
用智能指针怎么样?

或者把所有指针保存到map里,先把两个vector关闭,再从map里删除所有指针
------解决方案--------------------
一般来收,如果要使用容器保存指针,那么,其指针应该是一个不需要释放的对象指针,或者是一个智能指针(能够自己释放自己)。

否则,我建议使用容器来保存对象,而不是对象指针。

所以,我支持1楼。
------解决方案--------------------
这样的话我怎么感觉你delete两次了
------解决方案--------------------
对于Pt2来讲,如果使用的PT1的某个节点,实际上是是把该节点对象的地址进行了保存

虽然PT1释放的时候把PT1中该节点的对象地址置空了,但并没有把拷贝到PT2当中的地址值改变,造成PT2对该内存再次释放造成double free

一个临时的比喻希望你能看懂,你的身份证给了个复印件给你朋友,某天你将你的身份证注销了,但确没有把你朋友的复印件销毁,也没告诉他别再使用,所以当他拿着这个复印件去旅馆的时候,就被当中黑人拘留了。。。
------解决方案--------------------
探讨
这样的话我怎么感觉你delete两次了

------解决方案--------------------
两次delete的问题,我写代码碰到过
不过我当时没有你的2个vector公用元素的问题
我觉得如果你非要这样用
是不是在添加v2的时候能v2.push_back(new Pointer(根据v1[k]的属性new一个新的对象出来)),这样的话2个vector保存的虽然有数据相同的元素,但是v2里面的只是个拷贝的对象而已,地址不同,可以分别释放的
不过不知道你2个vector公共元素是否还有其他操作,2个公共元素的互相联系得有其他代码保证
------解决方案--------------------
delete了2次
简化一下
Pointer* p1 = new Pointer();
Pointer* p2 = p1;

delete p1; p1 = NULL; //没问题 p1被delete掉了
delete p2;//崩溃 因为p2已经被delete掉了
2个Vector的话 这么处理吧 先把vector1里的东西删掉 ,然后寻找vector2里面的 找出来赋值为NULL
C/C++ code

for(int i=0;i<Pt1.size();i++)
{
Pointer* pTemp = Pt1[i];
delete Pt1[i];
Pt1[1] = NULL;

//在第二个vector里找出指针地址相等的 赋值为空 不必delete了 前面已经delete过了
for(int j=0;j<Pt2.size();j++)
{
if(pTemp = Pt2[j]) 
{
Pt2[j] = NULL;
break;
}
}