編集メニュー > 新規作成 編集 コピー 名前の変更 アップロード 添付ファイル一覧 バックアップ

* TClonesArray [#e984a6c5]

** RemoveAllの挙動? [#xa1e0ab1]
 void chkTClonesArray(){
 
  TClonesArray *array = new TClonesArray("TNamed",10);
  array->SetName("array");
  //----------------------------------------
  for (Int_t i=0;i<3;++i){
    Int_t nobj = array->GetEntries();
    new ((*array)[nobj]) TNamed();
    TNamed *obj = (TNamed*)array->At(nobj);
    obj->SetName(Form("obj_%d",i));
  }
 
  for (Int_t i=0;i<3;++i){
    TNamed *obj = (TNamed*)array->At(i);
    cout<<i<<" "<<obj->GetName()<<endl;
  }
  TNamed *obj = (TNamed*)array->At(1);
 
 // (1)
   array->Delete();
 
 // (2)
 //  array->RemoveAt(1);
 //  array->Compress();
 
 // (3)
 //  array->RemoveAll();
 //  array->Compress();
 
  cout<<obj->GetName()<<endl;
  cout<<obj->GetTitle()<<endl;
 
  array->Delete();
  cout<<endl<<"array is deleted"<<endl<<endl;
 
  cout<<obj->GetName()<<endl;
 
  //----------------------------------------
 
 }


このマクロで(1)−(3)の部分を変えると挙動が違う。

(1)と(2)は
 aproot [0] .x macros/chkTClonesArray/chkTClonesArray.cc
 0 obj_0
 1 obj_1
 2 obj_2
 TObject
 Basic ROOT object
 
 array is deleted
 
 TObject

となり、オブジェクトが初期化されている。一方(3)で走らせると、
 aproot [0] .x macros/chkTClonesArray/chkTClonesArray.cc
 0 obj_0
 1 obj_1
 2 obj_2
 obj_1
 
 
 array is deleted
 
 obj_1
となり、オブジェクトはdelete(初期化)されていないように見える。そしてこれを使うとどうもメモリーリークするように見える。。。なぜRemoveAllとRevemoAtの挙動が違うのよ?
となり、オブジェクトはdelete(初期化というべき?)されていないように見える。そしてこれを使うとどうもメモリーリークするように見える。。。なぜRemoveAllとRevemoAtの挙動が違うのよ?


** Removeの使い方 [#nc1b7c8a]
以下のように使う。

 for (int i=0;i<Array->GetEntriesFast();++i){
   Txx *obj = (Txx*)Array->At(i);
   if (条件){
     Array->RemoveAt(i);
   }
 }
 Array->Compress();

以下のように書くとどうもダメみたい。

***ダメ例2 [#n631a50a]
 for (int i=0;i<Array->GetEntries();++i){
   Txx *obj = (Txx*)Array->At(i);
   if (条件){
     Array->RemoveAt(i);
   }
 }
 Array->Compress();

***ダメ例1(ダメじゃないかも?) [#gfae53f2]

 for (int i=0;i<Array->GetEntries();++i){
   Txx *obj = (Txx*)Array->At(i);
   if (条件){
     Array->RemoveAt(i);
     Array->Compress();
     --i;
   }
 }