[help]"RemoveAndDestroyAllChildren()" crash progra

LuRenJia

09-01-2007 15:00:01

My program is a win32 form, I modified from Mogre win32Form sample. App always crash when destroying scene, even I only appended one node to scene manager(I used octree manager).

This is the destroy code:

// sd.Name is a SceneNode's name
SceneNode sn = (SceneNode)SceneMgr.RootSceneNode.GetChild ( sd.Name );
SceneNode.ChildNodeIterator cni = sn.GetChildIterator ();
while ( cni.MoveNext () )
{
SceneNode child = (SceneNode)cni.Current;
child.DetachAllObjects ();
}
sn.RemoveAndDestroyAllChildren (); // <---- crash
sn.DetachAllObjects ();
SceneMgr.RootSceneNode.RemoveChild ( sd.Name );
SceneMgr.DestroySceneNode ( sd.Name );


Here is stack trace:

> OgreMain_d.dll!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,Ogre::SceneNode *,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,Ogre::SceneNode *> >,0> >::_Orphan_ptr(std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,Ogre::SceneNode *,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,Ogre::SceneNode *> >,0> > & _Cont={...}, std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,Ogre::SceneNode *,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,Ogre::SceneNode *> >,0> >::_Node * _Ptr=0x1b391ac0) line 1278 + 0x8 bytes C++
OgreMain_d.dll!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,Ogre::SceneNode *,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,Ogre::SceneNode *> >,0> >::erase(std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,Ogre::SceneNode *,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,Ogre::SceneNode *> >,0> >::iterator _Where=("temple",0x1b387588 {mObjectsByName=[0]() mLightList=[0]() mLightListDirty=true ...})) line 765 C++
OgreMain_d.dll!Ogre::SceneManager::destroySceneNode(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & name=<invalid pointer>) line 724 + 0x2c bytes C++
Plugin_OctreeSceneManager.dll!0e9099f4()
[...]
OgreMain_d.dll!Ogre::SceneNode::removeAndDestroyAllChildren() line 402 + 0x2f bytes C++
[...]
Mogre.dll!Mogre::SceneNode::RemoveAndDestroyAllChildren() line 193 + 0x27 bytes C++
BVR.exe!BVR.WinVRCore.DestoryScene(BVR.SceneDesc sd = {BVR.SceneDesc}) line 294 + 0xa bytes C#
BVR.exe!BVR.formMain.ExitSystem() line 129 + 0x3b bytes C#



anyone ran into the problem too?

Bekas

10-01-2007 16:49:42

Can you isolate the problem in a sample and post it?

LuRenJia

14-01-2007 08:05:30

hi Bekas!

you can download the rar package from here:
http://www.51files.com/?YLBIL8NR9LE5IFI

press the big link button at top-right corner. :D

Bekas

22-01-2007 23:00:13

Ok, I've found the problem.
It's caused by incompatible exception handling (Mogre must use /EHa while Ogre uses /EHsc) leading to crashes because destructors are not executed. Fixed it now.

CK_MACK

22-01-2007 23:07:29

Bekas, is the fix something we download? or a code change to his program?

Thanks,

Marc.

Bekas

22-01-2007 23:24:24

The fix is on Mogre's SVN and will be in the next SDK release (probably tomorrow).