It seems that IntersectionDetector is not deleted properly, when for new 
object is created in FunctionSpace.cpp:120 :

   // Initialize intersection detector if not done before
   if (!intersection_detector)
     intersection_detector = new IntersectionDetector(*_mesh);.

I've reduce the problem to very simple example, where only valgrind 
realize the error. But in real application, it lead my software to
segmentation faults.

Can anyone confirm this?

BArtek


Bartosz Sawicki wrote:
>  From hg repository. pull&update 15 minutes ago.
> 
> BArtek
> 
> 
> Garth N. Wells wrote:
>> Which version of DOLFIN are you using?
>>
>> Garth
>>
>> Bartosz Sawicki wrote:
>>> 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
>>> _______________________________________________
>>> 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

_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev

Reply via email to