Jump to content
  • Advertisement
Sign in to follow this  
DrZoidberg

Odd deletion problem

This topic is 4830 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

hello, ok this makes no sense (well to me anyways). ok i have a class that checks to see if objects are alive and then deletes them if they are dead. when the program closes it deletes all objects that are still left in that list. the destructor is as follows. for(list<IPollingObject*>::iterator i = m_listObjects.begin(); i != m_listObjects.end(); i++) { delete *i; } ok if no objects withen the course of the program are deleted the destructor runs fine, but if any object is removed (which it does becasue the list size reduces) i get a run time error on exit pointing me to the line "delete *i" ok but if i change the destructor to this ... list<IPollingObject*>::iterator i = m_listObjects.begin(); while (i != m_listObjects.end()) { delete (*i); i++; } i get a runtime error again but it points me here in a header called xmemory void deallocate(pointer _Ptr, size_type) { // deallocate object at _Ptr, ignore size ::operator delete(_Ptr); } points to the ::operator delete(_Ptr); what is going on here ??? im using ms visual studio express. thanks for any help. EDIT: i should thank leiavoia for pointing me in the right direction on a previous post.

Share this post


Link to post
Share on other sites
Advertisement
Did you remove the item from the list? Sure doesn't look that way. Which would mean you are attempting to delete an object that has already been deleted...

Share this post


Link to post
Share on other sites
Yup, looks like you need to call erase after you delete it, or at least null the pointer after deletion. Deleting NULL is harmless IIRC.

Share this post


Link to post
Share on other sites
i'm pretty sure the objects are being deleted. for instance objects that can be drawn are tested before each render and objects which return false on poll are removed from that list.

then at the end of each frame, each object that returns false on poll is actually deleted.

this is the actual code ...

EDIT: the interface ISceneNode derives from IPollingObject


void CScene::render() {
for (uint_t n = 0; n < m_treeObjects.size(); n++) {
list<ISceneNode*>::iterator i = m_treeObjects[n].begin();
while (i != m_treeObjects[n].end()) {
if ((*i)->poll()) {
(*i)->draw(m_bmpBuffer);
i++;
}
else {
i = m_treeObjects[n].erase(i);
}
}
}
}






void CPollingDevice::update() {
list<IPollingObject*>::iterator i = m_listObjects.begin();
while (i != m_listObjects.end()) {
if ((*i)->poll()) {
i++;
}
else {
delete *i;
i = m_listObjects.erase(i);
}
}
}





basically im testing so when i press the space bar an object will return false on the next poll (being immidatly after the key was pressed in the same frame)

when i actually remove the object in the program by hitting space bar it is removed from the scene, and the list size of the poller goes down, and the list size of the scene goes down, so the lists for each system the object belongs to is affected.

so i really don't know what is going on, becasue usually if i try and delete something that isnt there it gives me a segmentation fault.

Share this post


Link to post
Share on other sites
So basically, you've got the same item in multiple lists? That could get scary later on. Do you think there is any chance you could consolidate your lists?

Failing that, you just need to be very careful to iterate your lists in very specific order. I can't see anything else to fix.

However, i did notice that your two lists do different functions. It looks like one draws and the other cleans up. Correct? Is there a chance you could clean up as you go? like

if (condition) { do something } else { kill'em }

If you can do both at once, you don't have to iterate over the objects again. The original code i posted does this (i can tell you looked at it, then bastardized it with your Hungarian Notation ;-P ) My first draft of my object processor tried to do it in two passes and i cleaned it up so it works in one, like above.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!