last-modified: 2019-04-28 (日) 18:36:58 (1834d)[変更箇所]
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?の挙動が違うのよ?
以下のように使う。
for (int i=0;i<Array->GetEntriesFast();++i){ Txx *obj = (Txx*)Array->At(i); if (条件){ Array->RemoveAt(i); } } Array->Compress();
以下のように書くとどうもダメみたい。
for (int i=0;i<Array->GetEntries();++i){ Txx *obj = (Txx*)Array->At(i); if (条件){ Array->RemoveAt(i); } } Array->Compress();
for (int i=0;i<Array->GetEntries();++i){ Txx *obj = (Txx*)Array->At(i); if (条件){ Array->RemoveAt(i); Array->Compress(); --i; } }