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
一个临时的比喻希望你能看懂,你的身份证给了个复印件给你朋友,某天你将你的身份证注销了,但确没有把你朋友的复印件销毁,也没告诉他别再使用,所以当他拿着这个复印件去旅馆的时候,就被当中黑人拘留了。。。
[解决办法]
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;}}