PDA

View Full Version : STL question



Sergiu
02-17-2009, 02:28 PM
I have created a list of class objects.The question is, why doesn't the following code delete the list items when the condition is fufilled.
The code:

.....
list<racheta*> listaRachete;
list<racheta*>::iterator iterIntList;
.....

switch(key)
{
case 32 :
racheta *a=new racheta;
listaRachete.push_front(a);
break;
}
......

......
for(iterIntList=listaRachete.begin();iterIntList!= listaRachete.end();iterIntList++) {
if ((*iterIntList)->dead==1) delete *iterIntList;
else
(*iterIntList)->mutaRacheta();}
.....

trinitrotoluene
02-17-2009, 07:13 PM
The following line of code is dangerous :


if ((*iterIntList)->dead==1) delete *iterIntList;


You delete the memory of the pointer in the STL list but the pointer is still in the list.

I think you can do something like this


for(iterIntList=listaRachete.begin();iterIntList!= listaRachete.end();iterIntList++) {
if ((*iterIntList)->dead==1)
{
delete *iterIntList;
listaRachete.erase(iterIntList);
}
else
{
(*iterIntList)->mutaRacheta();}
}


I have not tested so I hope that it will not segfault.

Sergiu
02-18-2009, 01:23 AM
The code doesn't work.Thank you for trying altought.

Simon Mihevc
02-18-2009, 01:34 AM
As previously mentioned you deleted the object that is still within the list. One suggestion, take a look at the boost library and it's smart pointer(like shared_ptr). shared_ptr deletes the object for you when reference count drops to 0. Then you can do


typedef boost::shared_ptr<racheta> pracheta;
std::list<pracheta> listaRachete;
...
listaRachete.push_front(pracheta(new racheta));
...

As for deleting object from list. A proper way of doing this would be like this:



...
class ErasePred
{
public:
bool operator()(prachete r) const
{
if (r->dead == 1)
{
return true;
}
else
{
return false;
}
}
};
...
// remove all elements for which
// ErasePred::operator() returns true
std::remove_if(listaRachete.begin(),
listaRachete.end(),
ErasePred());

...of the top of my head.

Sergiu
02-18-2009, 03:49 AM
There seems to be an error with the declaration of class ErasePred...

trinitrotoluene
02-18-2009, 08:24 AM
The problem with my code is after this instruction listaRachete.erase(iterIntList); I cannot use the iterIntList iterator anymore to advance in the list.

The following use 2 iterators:



list<racheta*>::iterator iterIntList;
list<racheta*>::iterator deleteIntList;

iterIntList = iterIntList=listaRachete.begin();
while(iterIntList!=listaRachete.end())
{
if ((*iterIntList)->dead==1)
{
deleteIntList = iterIntList;
iterIntList++;
delete *deleteIntList;
listaRachete.erase(deleteIntList);
}
else
{
(*iterIntList)->mutaRacheta();}
iterIntList++;
}

}


I have tested that and it work.

Sergiu
02-18-2009, 09:03 AM
Thank you very much for the help.You helped allot.