[Rivet] Memory error

Andy Buckley andy.buckley at cern.ch
Mon Oct 17 15:47:19 BST 2016


On 17/10/16 15:29, Alan Kaptanoglu wrote:
> Hello,
>
> I am trying to declare jets with area in the initialization section of
> my Rivet Analysis. I originally tried:
>
>       fastjet::GhostedAreaSpec areaspec(2.5,1,0.01);
>       fastjet::AreaDefinition
> area_def(fastjet::active_area_explicit_ghosts,areaspec);
>       FastJets jets(vfs, FastJets::ANTIKT, Rsmall);
>       jets.useJetArea(area_def);
>       jets.useInvisibles(JetAlg::ALL_INVISIBLES);
>       jets.useMuons(JetAlg::DECAY_MUONS);
>       declare(jets, "jets");
>
> but this definition goes out of scope so when I ask for jet areas in my
> "analysis" section of my code, it complains the jets have no valid jet
> area associated with them. I next tried several versions of:
>
>       areaspec = new fastjet::GhostedAreaSpec(2.5,1,0.01);
>       area_def = new
> fastjet::AreaDefinition(fastjet::active_area_explicit_ghosts,*areaspec);
>       FastJets jets(vfs, FastJets::ANTIKT, Rsmall);
>       jets.useJetArea(area_def);
>       jets.useInvisibles(JetAlg::ALL_INVISIBLES);
>       jets.useMuons(JetAlg::DECAY_MUONS);
>       declare(jets, "jets");
>
> where areaspec and area_def are private members of my Analysis class. I
> also tried initializing these variables in my constructor using
> initialization lists, as well as declaring them global variables (and
> yes, to my knowledge, I am also deleting them correctly if I use "new").
> In all these cases, the code runs correctly but complains at the end of
> a memory error, which is attached in a text file. Any idea why this is
> happening or how to fix?

Hi Alan,

The AreaDefinition provided to FastJets must be a heap-allocated pointer 
whose ownership is then taken over by the FastJets object: it will 
delete the pointer at the end of the run so you shouldn't try to do that 
yourself. (This is documented on the useJetArea() function)

To this end I usually make sure that I don't have a variable of my own 
pointing at that area def objects, e.g.
  fj.useJetArea(new fastjet::AreaDefinition(fastjet::VoronoiAreaSpec()));

As you noticed, if you pass in a locally allocated object, it goes out 
of scope and you get a crash. Although I'm not sure how you're able to 
pass it in by value rather than by pointer!

I would like, if possible, to avoid this pointer ownership stuff in the 
FastJets interface... I'm sure it's possible, just needs a bit of care 
and thought about backward compatibility. Pointers were used 
historically because we need the option of a null AreaDefinition, and 
there's no such thing as a null reference in C++.

Hope that helps,
Andy

-- 
Dr Andy Buckley, Lecturer / Royal Society University Research Fellow
Particle Physics Expt Group, University of Glasgow


More information about the Rivet mailing list