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的问题,我写代码碰到过
不过我当时没有你的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
大家好!
我现在有两个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的问题,我写代码碰到过
不过我当时没有你的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; } }