[ROOT] CINT and STL vector of private class

From: Xiaorong Wang (phyxxw@panther.gsu.edu)
Date: Wed Apr 16 2003 - 06:20:57 MEST


Dear Root expert,

I need your help on this issue. I am using ROOT 3.01/05, linux 7.3.
Thanks for your time.

I created two private class Paricle and Dimuon(two particles build one
Dimuon), and use 

	rootcint -f $*Dict.C -c $(CINTFLAGS) $(DEFS) $(INCLUDES) $*.hh

to generate the root dictionary and library file libDimuon.so.

I load this library and use STL vector in root macro file

*********************
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>

class Dimuon;
class Particle;

void main()
{
  gSystem->Load("install/lib/libDimuon.so");
  vector<Dimuon> DimuVec;
  vector<Particle> ParVec;
  
  int q1 = -1;
  int q2 = 1;
  float E1=3.0;
  float Px1=1.0;
  float Py1=1.0;
  float Pz1=1.0;
  float E2= 5.0;
  float Px2=1.4;
  float Py2=1.2;
  float Pz2=1.0;
  
  Particle *muon1 = new Particle(q1, E1,Px1,Py1,Pz1);
  Particle *muon2 = new Particle(q2, E2,Px2,Py2,Pz2);
    
  ParVec.push_back(*muon1);
  ParVec.push_back(*muon2);
  
  Dimuon *jpsi = new Dimuon(muon1, muon2);
  DimuVec.push_back(*jpsi);
  
  delete muon1;
  delete muon2;
  delete jpsi;
  
  vector<Particle>::iterator mu1;
  for (mu1 = ParVec.begin(); mu1 < ParVec.end(); ++mu1){
    cout << "I am here particle iterator loop " << endl;
  }  

  vector<Dimuon>::iterator dimu;
  for (dimu = DimuVec.begin(); dimu < DimuVec.end(); ++dimu){
    cout << "I am here Dimuon iterator loop " << endl;
  }   
  cout << "DimuVec size= " << DimuVec.size() << endl;
  cout << "ParVec size= " << ParVec.size() << endl;

}

********************************************

when I run this marco, I got correct output, at the end of the root run,
it crash by segmentation violation. 

***************
root [0] .L try.C
root [1] main()  
I am here particle iterator loop 
I am here particle iterator loop 
I am here Dimuon iterator loop 
DimuVec size= 1
ParVec size= 2

 *** Break *** segmentation violation
Root > Function main() busy flag cleared
**************** 

when I trace this root file: I got

*************
void destroy(Dimuon* first, Dimuon* last) {
    while (first != last) destroy(first++);
}
!!! Reading template destroy
# 120 "algobase.h"
120  
121  void destroy(Dimuon* first, Dimuon* last) {
122      while (first != last) destroy(first++);
123  }
!!!Complete instantiating template destroy

 *** Break *** segmentation violation
Root > !!!Destroy static member object 0x883f838
vector<Particle>::~TRint() !!!Destroy static member object 0x8822e58
vector<Dimuon>::~TRint() Function main() busy flag cleared
**************

PS: I can do this correctly using standard C++ without CINT, is this
CINT problem or I did something wrong.

Thanks,
Xiaorong



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:10 MET