Garth N. Wells wrote: > > [EMAIL PROTECTED] wrote: >> http://www.fenics.org/cgi-bin/bugzilla/show_bug.cgi?id=40 >> >> Summary: Memory leaked after (sub) DofMap extraction >> Product: DOLFIN >> Version: development version >> Platform: PC >> OS/Version: Linux >> Status: NEW >> Severity: blocker >> Priority: P2 >> Component: general >> AssignedTo: [email protected] >> ReportedBy: [EMAIL PROTECTED] >> >> >> This leak is seen eg. in the Stokes demo using Valgrind. It originates from >> where sub functions are extracted and appears to be a sub_dof_map not freed >> on >> line 132 of DofMap.cpp. This is in an area of Dolfin where I'm not familiar >> enough to suggest a fix. >> > > The problem is that both DofMap and BoundaryCondition::LocalData call > > DofMap* DofMap::extractDofMap(...) > > but don't assume responsibility for the data and clean up in the destructor. > > I'm looking at a solution, but I'm running into some problems that I > don't yet understand. > > Garth >
I've fixed the memory leaks, but it was hard to follow the code in DofMap, and the fix in DofMap.cpp is not entirely satisfying. Some functions return pointers to data that they create but then it's often not clear who owns the data. Perhaps DofMap should own all sub-DofMaps of it and be responsible for cleaning them all up? If a sub-DofMap is needed, DofMap can be asked for a reference to it. This would also simplify any re-ordering of the DofMap. Garth > >> /Dag >> >> ==32003== 8 bytes in 1 blocks are definitely lost in loss record 2 of 11 >> ==32003== at 0x4023294: operator new(unsigned) (vg_replace_malloc.c:224) >> ==32003== by 0x8080E1F: >> UFC_StokesBilinearForm_dof_map_0::create_sub_dof_map(unsigned) const >> (Stokes.h:6751) >> ==32003== by 0x40E3DDB: dolfin::DofMap::extractDofMap(ufc::dof_map const&, >> unsigned&, dolfin::Array<unsigned> const&) const (DofMap.cpp:132) >> ==32003== by 0x40E3FF1: >> dolfin::DofMap::extractDofMap(dolfin::Array<unsigned> const&, unsigned&) >> const >> (DofMap.cpp:93) >> ==32003== by 0x411032B: >> dolfin::DiscreteFunction::DiscreteFunction(dolfin::SubFunction&) >> (DiscreteFunction.cpp:94) >> ==32003== by 0x4108A12: dolfin::Function::operator=(dolfin::SubFunction) >> (Function.cpp:209) >> ==32003== by 0x41F5405: dolfin::LinearPDE::solve(dolfin::Function&, >> dolfin::Function&) (LinearPDE.cpp:110) >> ==32003== by 0x80660A1: main (main.cpp:86) >> >> > _______________________________________________ > DOLFIN-dev mailing list > [email protected] > http://www.fenics.org/mailman/listinfo/dolfin-dev _______________________________________________ DOLFIN-dev mailing list [email protected] http://www.fenics.org/mailman/listinfo/dolfin-dev
