* 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; } }