21948: EDF SMESH : Memory is not freed when deleting a mesh

Elimenate memory leaks on CORBA objects, servants of SALOMEDS objects etc
This commit is contained in:
eap 2012-12-14 14:06:12 +00:00
parent 413bba9e87
commit 64ed2f3e93
2 changed files with 68 additions and 68 deletions

View File

@ -554,9 +554,10 @@ QString GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* t
getGeomEngine()->AddInStudy(aStudyDS, theObj, theName, aFatherObj); getGeomEngine()->AddInStudy(aStudyDS, theObj, theName, aFatherObj);
QString anEntry; QString anEntry;
if ( !aSO->_is_nil() ) if ( !aSO->_is_nil() ) {
anEntry = aSO->GetID(); CORBA::String_var entry = aSO->GetID();
anEntry = entry.in();
}
// Each dialog is responsible for this method implementation, // Each dialog is responsible for this method implementation,
// default implementation does nothing // default implementation does nothing
restoreSubShapes(aStudyDS, aSO); restoreSubShapes(aStudyDS, aSO);
@ -770,7 +771,6 @@ bool GEOMBase_Helper::commitCommand( const char* )
//================================================================ //================================================================
bool GEOMBase_Helper::hasCommand() const bool GEOMBase_Helper::hasCommand() const
{ {
bool res = (bool) myCommand;
return (bool)myCommand; return (bool)myCommand;
} }
@ -1137,17 +1137,17 @@ GEOM::GEOM_Object_ptr GEOMBase_Helper::findObjectInFather( GEOM::GEOM_Object_ptr
if ( sobject ) { if ( sobject ) {
_PTR(ChildIterator) it( studyDS->NewChildIterator( sobject ) ); _PTR(ChildIterator) it( studyDS->NewChildIterator( sobject ) );
for ( ; it->More() && !found; it->Next() ) { for ( ; it->More() && !found; it->Next() ) {
GEOM::GEOM_Object_var cobject = GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( it->Value() ) ); GEOM::GEOM_Object_var cobject = GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( it->Value() ) );
if ( !CORBA::is_nil( cobject ) ) { if ( !CORBA::is_nil( cobject ) ) {
GEOM::ListOfLong_var indices = cobject->GetSubShapeIndices(); GEOM::ListOfLong_var indices = cobject->GetSubShapeIndices();
int length = indices->length(); int length = indices->length();
for ( int i = 0; i < length && !found; i++ ) { for ( int i = 0; i < length && !found; i++ ) {
if ( indices[i] == theIndex ) { if ( indices[i] == theIndex ) {
object = cobject; object = cobject;
found = true; found = true;
} }
} }
} }
} }
} }
} }
@ -1277,58 +1277,58 @@ QList<GEOM::GeomObjPtr> GEOMBase_Helper::getSelected( const QList<TopAbs_ShapeEn
SALOME_ListIteratorOfListIO it( selected ); SALOME_ListIteratorOfListIO it( selected );
bool stopped = false; bool stopped = false;
for ( ; it.More() && !stopped; it.Next() ) { for ( ; it.More() && !stopped; it.Next() ) {
Handle(SALOME_InteractiveObject) IO = it.Value(); Handle(SALOME_InteractiveObject) IO = it.Value();
GEOM::GeomObjPtr object = GEOMBase::ConvertIOinGEOMObject( IO ); GEOM::GeomObjPtr object = GEOMBase::ConvertIOinGEOMObject( IO );
if ( object ) { if ( object ) {
TColStd_IndexedMapOfInteger subShapes; TColStd_IndexedMapOfInteger subShapes;
selMgr->GetIndexes( IO, subShapes ); selMgr->GetIndexes( IO, subShapes );
int nbSubShapes = subShapes.Extent(); int nbSubShapes = subShapes.Extent();
if ( nbSubShapes == 0 ) { if ( nbSubShapes == 0 ) {
// global selection // global selection
if ( typeInList( (TopAbs_ShapeEnum)(object->GetShapeType()), types ) ) { if ( typeInList( (TopAbs_ShapeEnum)(object->GetShapeType()), types ) ) {
result << object; result << object;
if ( count > 0 ) { if ( count > 0 ) {
if ( strict && result.count() > count ) { if ( strict && result.count() > count ) {
result.clear(); result.clear();
stopped = true; stopped = true;
} }
else if ( !strict && result.count() == count ) else if ( !strict && result.count() == count )
stopped = true; stopped = true;
} }
} }
else if ( strict ) { else if ( strict ) {
result.clear(); result.clear();
stopped = true; stopped = true;
} }
} }
else { else {
// local selection // local selection
for ( int i = 1; i <= nbSubShapes && !stopped; i++ ) { for ( int i = 1; i <= nbSubShapes && !stopped; i++ ) {
int idx = subShapes( i ); int idx = subShapes( i );
GEOM::GeomObjPtr subShape = findObjectInFather( object.get(), idx ); GEOM::GeomObjPtr subShape = findObjectInFather( object.get(), idx );
if ( !subShape ) { if ( !subShape ) {
// sub-shape is not yet published in the study // sub-shape is not yet published in the study
GEOM::ShapesOpPtr shapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() ); GEOM::ShapesOpPtr shapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
subShape.take( shapesOp->GetSubShape( object.get(), idx ) ); // take ownership! subShape.take( shapesOp->GetSubShape( object.get(), idx ) ); // take ownership!
} }
if ( typeInList( (TopAbs_ShapeEnum)(subShape->GetShapeType()), types ) ) { if ( typeInList( (TopAbs_ShapeEnum)(subShape->GetShapeType()), types ) ) {
result << subShape; result << subShape;
if ( count > 0 ) { if ( count > 0 ) {
if ( strict && result.count() > count ) { if ( strict && result.count() > count ) {
result.clear(); result.clear();
stopped = true; stopped = true;
} }
else if ( !strict && result.count() == count ) else if ( !strict && result.count() == count )
stopped = true; stopped = true;
} }
} }
else if ( strict ) { else if ( strict ) {
result.clear(); result.clear();
stopped = true; stopped = true;
} }
} }
} }
} }
} }
} }
} }

View File

@ -206,7 +206,7 @@ char* GEOM_Object_i::GetName()
char* aName = _impl->GetName(); char* aName = _impl->GetName();
if (aName) if (aName)
return aName; // this is already copy of pointer (see implementation of _impl) return aName; // this is already copy of pointer (see implementation of _impl)
return strdup(""); return CORBA::string_dup("");
} }
//============================================================================= //=============================================================================