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

TClonesArray?

RemoveAll?の挙動?

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?の挙動が違うのよ?

Removeの使い方

以下のように使う。

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

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

ダメ例2

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

ダメ例1(ダメじゃないかも?)

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