list - C++ debugging segfault, runs fine without debugging -


i working tree-structure.

all nodes in tree kept in list, children of each node kept in list of treenode pointers within treenode object.

this should recursively erase subtree starting given node.

it erases treenode-object "nodes" list, , pointer in children-list.

it works fine, when use built in debugger in ide, segfaults first time destroysubtree called (*i). not segfault when run program normally, , should. means can't use debugger else in program. @ first thought had how actual erasing, segfaults @ first recursive call of destroysubtree - before erasing...

void tree::destroysubtree(treenode* node) {     if(node->children.size() == 0)         return;      list<treenode*>::iterator i;      for(i = node->children.begin(); != node->children.end(); i++)     {         destroysubtree((*i)); //segfaults here, when debugging          list<treenode>::iterator j;         for(j = nodes.begin(); j != nodes.end(); j++)         {            if((j)->nid == (*i)->nid)            {                nodes.erase(j);                break;            }         }         node->children.erase(i);         i--;     } } 

does know why happens, , how can avoid segfault?

it fails at, stl_list.h:768 if helps?

after call node->children->erase(i), i invalid iterator. operations on after cause of undefined behavior. need use is:

 = node->children.erase(i); 

and remove code incrementing , decrementing iterator.

for(i = node->children.begin(); != node->children.end(); /* ++i don't need this*/ ) {     destroysubtree((*i)); //segfaults here, when debugging      list<treenode>::iterator j;     for(j = nodes.begin(); j != nodes.end(); j++)     {        if((j)->nid == (*i)->nid)        {            nodes.erase(j);            break;        }     }     = node->children.erase(i);     // i--; don't need this. } 

Comments

Popular posts from this blog

python - mat is not a numerical tuple : openCV error -

c# - MSAA finds controls UI Automation doesn't -

wordpress - .htaccess: RewriteRule: bad flag delimiters -