← Back to team overview

dolfin team mailing list archive

Memory problem inside FunctionSpace

 

I realized strange problem in my code when Function is created using FiniteElement and DofMap. PETSc have reported memory problems, but it is difficult to repeat. I'm not able to locate the error, but it seems that the bug is inside the FunctionSpace.

Please consider following code. It compiles, it works works, but Valgrind reports errors.

================

#include <dolfin.h>

using namespace dolfin;

int main (int argc, char **argv) {

  UnitCube mesh(10,10,10);

  FiniteElement fe("FiniteElement('Lagrange', 'tetrahedron', 1)");
DofMap dofmap("FFC dof map for FiniteElement('Lagrange', 'tetrahedron', 1)", mesh);

  Function j( FunctionSpace(mesh, fe, dofmap) );

  j.vector() = 1.0;


  Point point( 0.5, 0.5, 0.5);
  Point value;

  j.eval((double *)value.coordinates(), point.coordinates());

  std::cout << value[0] << std::endl;

  return 0;
}
================

$ ./demo
1

$ valgrind ./demo
==20870== Memcheck, a memory error detector.
==20870== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==20870== Using LibVEX rev 1854, a library for dynamic binary translation.
==20870== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==20870== Using valgrind-3.3.1-Debian, a dynamic binary instrumentation framework.
==20870== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==20870== For more details, rerun with: -v
==20870==
==20870== Invalid write of size 8
==20870== at 0x4825B8A: VecGetValues_Seq (in /usr/lib/libpetscvec.so.2.3.3)
==20870==    by 0x4851887: VecGetValues (in /usr/lib/libpetscvec.so.2.3.3)
==20870== by 0x41EAD22: dolfin::PETScVector::get(double*, unsigned, unsigned const*) const (PETScVector.cpp:144) ==20870== by 0x4188024: dolfin::Function::interpolate(double*, dolfin::FunctionSpace const&, ufc::cell const&, unsigned, int) const (Function.cpp:266) ==20870== by 0x418041B: dolfin::FunctionSpace::eval(double*, double const*, dolfin::Function const&, ufc::cell const&, unsigned) const (FunctionSpace.cpp:149) ==20870== by 0x41842D6: dolfin::FunctionSpace::eval(double*, double const*, dolfin::Function const&) const (FunctionSpace.cpp:132) ==20870== by 0x41886DA: dolfin::Function::eval(double*, double const*) const (Function.cpp:206)
==20870==    by 0x8054EEF: main (main.cpp:38)
==20870==  Address 0x64f71d8 is 0 bytes inside a block of size 32 free'd
==20870== at 0x40241AA: operator delete[](void*) (vg_replace_malloc.c:364) ==20870== by 0x4180107: dolfin::FunctionSpace::Scratch::~Scratch() (FunctionSpace.cpp:302) ==20870== by 0x4180A98: dolfin::FunctionSpace::~FunctionSpace() (FunctionSpace.cpp:64)
==20870==    by 0x8054E82: main (main.cpp:22)
==20870==
==20870== Invalid write of size 8
==20870== at 0x40ED491: ffc_04_finite_element_0::evaluate_basis(unsigned, double*, double const*, ufc::cell const&) const (ffc_04.h:173) ==20870== by 0x4180496: dolfin::FunctionSpace::eval(double*, double const*, dolfin::Function const&, ufc::cell const&, unsigned) const (FiniteElement.h:60) ==20870== by 0x41842D6: dolfin::FunctionSpace::eval(double*, double const*, dolfin::Function const&) const (FunctionSpace.cpp:132) ==20870== by 0x41886DA: dolfin::Function::eval(double*, double const*) const (Function.cpp:206)
==20870==    by 0x8054EEF: main (main.cpp:38)
==20870==  Address 0x64f7228 is 0 bytes inside a block of size 8 free'd
==20870== at 0x40241AA: operator delete[](void*) (vg_replace_malloc.c:364) ==20870== by 0x4180116: dolfin::FunctionSpace::Scratch::~Scratch() (FunctionSpace.cpp:303) ==20870== by 0x4180A98: dolfin::FunctionSpace::~FunctionSpace() (FunctionSpace.cpp:64)
==20870==    by 0x8054E82: main (main.cpp:22)
==20870==
==20870== Invalid read of size 8
==20870== at 0x41804B8: dolfin::FunctionSpace::eval(double*, double const*, dolfin::Function const&, ufc::cell const&, unsigned) const (FunctionSpace.cpp:158) ==20870== by 0x41842D6: dolfin::FunctionSpace::eval(double*, double const*, dolfin::Function const&) const (FunctionSpace.cpp:132) ==20870== by 0x41886DA: dolfin::Function::eval(double*, double const*) const (Function.cpp:206)
==20870==    by 0x8054EEF: main (main.cpp:38)
==20870==  Address 0x64f71d8 is 0 bytes inside a block of size 32 free'd
==20870== at 0x40241AA: operator delete[](void*) (vg_replace_malloc.c:364) ==20870== by 0x4180107: dolfin::FunctionSpace::Scratch::~Scratch() (FunctionSpace.cpp:302) ==20870== by 0x4180A98: dolfin::FunctionSpace::~FunctionSpace() (FunctionSpace.cpp:64)
==20870==    by 0x8054E82: main (main.cpp:22)
==20870==
==20870== Invalid read of size 8
==20870== at 0x41804BB: dolfin::FunctionSpace::eval(double*, double const*, dolfin::Function const&, ufc::cell const&, unsigned) const (FunctionSpace.cpp:158) ==20870== by 0x41842D6: dolfin::FunctionSpace::eval(double*, double const*, dolfin::Function const&) const (FunctionSpace.cpp:132) ==20870== by 0x41886DA: dolfin::Function::eval(double*, double const*) const (Function.cpp:206)
==20870==    by 0x8054EEF: main (main.cpp:38)
==20870==  Address 0x64f7228 is 0 bytes inside a block of size 8 free'd
==20870== at 0x40241AA: operator delete[](void*) (vg_replace_malloc.c:364) ==20870== by 0x4180116: dolfin::FunctionSpace::Scratch::~Scratch() (FunctionSpace.cpp:303) ==20870== by 0x4180A98: dolfin::FunctionSpace::~FunctionSpace() (FunctionSpace.cpp:64)
==20870==    by 0x8054E82: main (main.cpp:22)
1
==20870==
==20870== ERROR SUMMARY: 16 errors from 4 contexts (suppressed: 353 from 2)
==20870== malloc/free: in use at exit: 16 bytes in 2 blocks.
==20870== malloc/free: 463 allocs, 461 frees, 168,090 bytes allocated.
==20870== For counts of detected errors, rerun with: -v
==20870== searching for pointers to 2 not-freed blocks.
==20870== checked 4,507,820 bytes.
==20870==
==20870== LEAK SUMMARY:
==20870==    definitely lost: 16 bytes in 2 blocks.
==20870==      possibly lost: 0 bytes in 0 blocks.
==20870==    still reachable: 0 bytes in 0 blocks.
==20870==         suppressed: 0 bytes in 0 blocks.
==20870== Rerun with --leak-check=full to see details of leaked memory.


BArtek


Follow ups