Re: weird trouble with vectors

From: Mario Kadastik <mario.kadastik_at_cern.ch>
Date: Mon, 3 Jul 2006 11:01:07 +0300


Ok, when I first thought that it might be me misusing clear, then pop_back() should work nicely when I have more than 1 elements. Well it doesn't:

[oberon] /home/mario/pythia > root -l -b
root [0] TLorentzVector p1 = TLorentzVector(1,2,3,4)
root [1] TLorentzVector p2 = TLorentzVector(3,4,7,10)
root [2] vector<TLorentzVector> tst;
root [3] tst.push_back(p1)
root [4] tst.push_back(p2)
root [5] tst.size()

(const unsigned int)2
root [6] tst.pop_back()

what's even worse is that with a tick older version of root (5.08/00) which I have on my iBook, the failure message is a bit better:

root [0] TLorentzVector p1 = TLorentzVector(1,2,3,4)
root [1] TLorentzVector p2 = TLorentzVector(2,3,4,9)
root [2] vector<TLorentzVector> tst;
root [3] tst.push_back(p1)
root [4] tst.push_back(p2)
root [5] tst.size()

(const unsigned int)2
root [6] tst.pop_back()
root.exe(3013) malloc: *** Deallocation of a pointer not malloced: 0x3340728; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug

the one with just the segfault is ROOT version 5.11/06 on Linux x86.

Mario

On Jul 3, 2006, at 10:29 AM, Mario Kadastik wrote:

> Hello,
>
> I couldn't quite figure out why my code is randomly crashing with
> segfaults until I started to test around segments of it and came to
> a bizarre conclusion, that vectors are behaving oddly:
> [oberon] /home/mario/pythia > root -l -b
> root [0] TLorentzVector p1 = TLorentzVector(1,2,3,4)
> root [1] p1.M()
> (const Double_t)1.41421356237309515e+00
> root [2] vector<TLorentzVector> tst;
> root [3] tst.push_back(p1)
> root [4] tst.size()
> (const unsigned int)1
> root [5] tst.clear()
> root [6] tst.size()
> (const unsigned int)0
> root [7] tst.push_back(p1)
> root [8] tst.size()
>
> *** Break *** segmentation violation
>
> Or for example:
> [oberon] /home/mario/pythia > root -l -b
> root [0] TLorentzVector p1 = TLorentzVector(1,2,3,4)
> root [1] TLorentzVector p2 = TLorentzVector(3,4,7,10)
> root [2] vector<TLorentzVector> tst;
> root [3] tst.size()
> (const unsigned int)0
> root [4] tst.push_back(p1)
> root [5] tst.push_back(p2)
> root [6] tst.clear()
>
> *** Break *** segmentation violation
>
> what am I doing wrong? This seems to be some basic misunderstanding
> on my part on vectors. Am I not supposed to clear them? And if I'm
> not, then why is the function there? Am I misusing it? What I'd
> like to do is to have two vectors of TLorentzVector type. One for
> positive particles, other for negative and then I could fill them
> at every event, iterate over them to generate plots and then at the
> end of the event clear them for the next event. How am I supposed
> to do that without using the clear function?
>
> --------------------------------
> Mario Kadastik
> CMS experiment
> mario.kadastik_at_cern.ch
>
> "Physics is like sex, sure it may give some practical results, but
> that's not why we do it"
> --- Richard P. Feynman
>
>



Mario Kadastik
CMS experiment
mario.kadastik_at_cern.ch

"Physics is like sex, sure it may give some practical results, but that's not why we do it"

Received on Mon Jul 03 2006 - 10:01:24 MEST

This archive was generated by hypermail 2.2.0 : Mon Jan 01 2007 - 16:31:59 MET