[osg-users] osg2.4 osgUtil::Tessellator bug,cause memory leak
heishuijing_2000
heishuijing_2000 at 126.com
Tue Jul 22 18:17:19 PDT 2008
hi,
Some days later,i have sent a email which is about this subject,and Gordon Tomlinson answered as this:
>This is a compiler problem not an OSG problem, so you really need to ask
>Microsoft, it's a problem with their compiler and code not OSG
this is my email before:
>>>hi,
>>>I am sorry to ask about this topic again,:). I have asked the same
>>>question before. That's about osgMFC example. Somebody in this email List
>>>have help me with it. And that's perfect.
>>> >>There is a known issue/BUG with MFC, were MFC makes a call to
>>> >>_CrtDumpMemoryLeaks() in the destructor of the _AFX_DEBUG_STATE, followed
>>> by _CrtSetDbgFlag() which sets it to ~_CRTDBG_LEAK_CHECK_DF (therefor
>>> >>disabling memory leak test at *true* program exit) This destructor is
>>> called at exit (i.e. atexit()), but before statics residing in dlls and
>>> >>others are destroyed, resulting in many false memory leaks are reported
>>> I use VS2003 and osg2.4 in debug mode. In my project, i Just add
>>> mfc71d.lib before all of the osg Libs ,and the VS no longer report memory.
>>> Unfortunately,recently the project report memory leak again. That is
>>> about osgUtil::Tessellator,Here is my test code:
>>> //the test code is drawing a concave like a rect containing a triangle with
>>> it .The Rect and the triangle intersect with one point,as
>>> //we can see bellow
>>> //an concave polygon
>>> // *******************************
>>> // * * * *
>>> // * * * *
>>> // * * * *
>>> // * * * *
>>> // * *********** *
>>> // * *
>>> // *******************************
>>> osgViewer::Viewer viewer;
>>> osg::ref_ptr< osg::Vec3Array > vertices = new osg::Vec3Array;
>>> vertices->push_back(osg::Vec3(-100,0,-100));
>>> vertices->push_back(osg::Vec3(100,0,-100));
>>> vertices->push_back(osg::Vec3(100,0,100));
>>> vertices->push_back(osg::Vec3(0,0,100));
>>> vertices->push_back(osg::Vec3(50,0,50));
>>> vertices->push_back(osg::Vec3(-50,0,50));
>>> vertices->push_back(osg::Vec3(0,0,100));
>>> vertices->push_back(osg::Vec3(-100,0,100));
>>> osg::ref_ptr< osg::Vec3Array > pNormal = new osg::Vec3Array();
>>> pNormal->push_back(osg::Vec3(0,-1,0));
>>> osg::ref_ptr <osg::Geometry> geom = new osg::Geometry;
>>> geom->setVertexArray(vertices.get());
>>> geom->setNormalArray(pNormal.get());
>>> geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
>>> geom->addPrimitiveSet(new
>>> osg::DrawArrays(osg::PrimitiveSet::POLYGON,0,vertices->size()));
>>> osg::ref_ptr< osgUtil::Tessellator > tes = new osgUtil::Tessellator();
>>> tes->setTessellationType(osgUtil::Tessellator::TESS_TYPE_GEOMETRY);
>>> tes->setBoundaryOnly(false);
>>> tes->setWindingType( osgUtil::Tessellator::TESS_WINDING_ODD);
>>> tes->retessellatePolygons(*geom);
>>> osg::ref_ptr<osg::Geode> geode = new osg::Geode;
>>> geode->addDrawable(geom.get());
>>> osg::ref_ptr<osg::Group> pGroup = new osg::Group;
>>> pGroup->addChild(geode.get());
>>> viewer.setSceneData( pGroup.get() );
>>> I test this code in non-MFC project such as console project,that works
>>> perfect.No memory leak is reported. But when i turn to osg MFC project,the
>>> VS always reports memory leak . I notice that if the polygon is
>>> self-intersect ,there must be memory leak report in MFC project.
>>> I really do not know how to do about it . I just want to find a method to
>>> prevent the VS reprot false memory leak. Anyone help me? Thank you ,:)
Recently i trace this memory leak In VS with osg2.4 osgviewerMFC project, i do find the problem.I modify the osg code:
void Tessellator::reset()
{
if (_tobj)
{
gluDeleteTess(_tobj);
_tobj = 0;
}
for (Vec3dList::iterator i = _coordData.begin(); i != _coordData.end(); ++i) {
delete (*i);
}
_coordData.clear();
_newVertexList.clear();
_primList.clear();
_errorCode = 0;
}
as below:
void Tessellator::reset()
{
if (_tobj)
{
gluDeleteTess(_tobj);
_tobj = 0;
}
for (Vec3dList::iterator i = _coordData.begin(); i != _coordData.end(); ++i) {
delete (*i);
}
osg::Vec3* vertex = NULL;
for (NewVertexList::iterator j = _newVertexList.begin(); j != _newVertexList.end(); ++j) {
NewVertex& newVertex = (*j);
vertex = newVertex._vpos;
delete vertex;
newVertex._vpos = NULL;
}
vertex = NULL;
_coordData.clear();
_newVertexList.clear();
_primList.clear();
_errorCode = 0;
}
Then the memory leak report disappears,and this does perfect. As glu does, osgUtil::Tessalator can draw composite polygon containing concave polygon and self-intersecting polygon.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20080723/04abb466/attachment-0002.htm>
More information about the osg-users
mailing list