Hi,
I’m trying to reduce memory leaks in my code (C++ compiled against ROOT libraries) and I’ve noticed large memory leaks when reading TChains, particularly from TChain->GetEntries and TChain->GetEntry. The minimal code sample below produces a huge number of memory leak reports from valgrind (attached below the code) even when running with the valgrind-root.supp (as I am here). Are these real? If they are, is there anything I can do to get around this problem? If they’re spurious, shouldn’t they be included in the valgrind-root.supp?
Thank you,
James
=============================================================================
#include “TChain.h”
int main(int argc, char **argv) {
TChain qcdChain = new TChain( “qcd” );
qcdChain->Add( "/unix/atlas2/robinson/qcdntuples/JetTauEtmiss/periodB/.root*" );
unsigned long totalEntries = qcdChain->GetEntries();
for (unsigned long eventNumber = 0; eventNumber < 1000; ++eventNumber) {
qcdChain->GetEntry(eventNumber);
}
delete qcdChain;
return 0;
}
==6520== 6,298 (1,440 direct, 4,858 indirect) bytes in 9 blocks are definitely lost in loss record 34,273 of 34,366
==6520== at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==6520== by 0x50755D9: TStorage::ObjectAlloc(unsigned long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x454E70: TObject::operator new(unsigned long) (TObject.h:156)
==6520== by 0x6375D50: ROOT::new_TStreamerInfo(void*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50CD00C: TClass::New(TClass::ENewType) const (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x629F5F0: TBufferFile::ReadObjectAny(TClass const*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50B4D2E: TBuffer& operator>>(TBuffer&, TObject*&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x50B9ACA: TList::Streamer(TBuffer&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x62CB166: TKey::ReadObjWithBuffer(char*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B62CC: TFile::GetStreamerInfoList() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B8C39: TFile::ReadStreamerInfo() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B3D0D: TFile::Init(bool) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B999B: TFile::TFile(char const*, char const*, char const*, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62BD711: TFile::Open(char const*, char const*, char const*, int, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x7A613CC: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A60C02: TChain::GetEntries() const (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x454DDA: main (D3PDReader.cxx:10)
==6520==
==6520== 6,298 (1,440 direct, 4,858 indirect) bytes in 9 blocks are definitely lost in loss record 34,274 of 34,366
==6520== at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==6520== by 0x50755D9: TStorage::ObjectAlloc(unsigned long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x454E70: TObject::operator new(unsigned long) (TObject.h:156)
==6520== by 0x6375D50: ROOT::new_TStreamerInfo(void*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50CD00C: TClass::New(TClass::ENewType) const (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x629F5F0: TBufferFile::ReadObjectAny(TClass const*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50B4D2E: TBuffer& operator>>(TBuffer&, TObject*&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x50B9ACA: TList::Streamer(TBuffer&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x62CB166: TKey::ReadObjWithBuffer(char*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B62CC: TFile::GetStreamerInfoList() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B8C39: TFile::ReadStreamerInfo() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B3D0D: TFile::Init(bool) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B999B: TFile::TFile(char const*, char const*, char const*, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62BD711: TFile::Open(char const*, char const*, char const*, int, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x7A613CC: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A60C02: TChain::GetEntries() const (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x454DDA: main (D3PDReader.cxx:10)
==6520==
==6520== 6,298 (1,440 direct, 4,858 indirect) bytes in 9 blocks are definitely lost in loss record 34,275 of 34,366
==6520== at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==6520== by 0x50755D9: TStorage::ObjectAlloc(unsigned long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x454E70: TObject::operator new(unsigned long) (TObject.h:156)
==6520== by 0x6375D50: ROOT::new_TStreamerInfo(void*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50CD00C: TClass::New(TClass::ENewType) const (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x629F5F0: TBufferFile::ReadObjectAny(TClass const*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50B4D2E: TBuffer& operator>>(TBuffer&, TObject*&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x50B9ACA: TList::Streamer(TBuffer&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x62CB166: TKey::ReadObjWithBuffer(char*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B62CC: TFile::GetStreamerInfoList() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B8C39: TFile::ReadStreamerInfo() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B3D0D: TFile::Init(bool) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B999B: TFile::TFile(char const*, char const*, char const*, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62BD711: TFile::Open(char const*, char const*, char const*, int, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x7A613CC: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A60C02: TChain::GetEntries() const (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x454DDA: main (D3PDReader.cxx:10)
==6520==
==6520== 6,298 (1,440 direct, 4,858 indirect) bytes in 9 blocks are definitely lost in loss record 34,276 of 34,366
==6520== at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==6520== by 0x50755D9: TStorage::ObjectAlloc(unsigned long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x454E70: TObject::operator new(unsigned long) (TObject.h:156)
==6520== by 0x6375D50: ROOT::new_TStreamerInfo(void*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50CD00C: TClass::New(TClass::ENewType) const (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x629F5F0: TBufferFile::ReadObjectAny(TClass const*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50B4D2E: TBuffer& operator>>(TBuffer&, TObject*&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x50B9ACA: TList::Streamer(TBuffer&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x62CB166: TKey::ReadObjWithBuffer(char*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B62CC: TFile::GetStreamerInfoList() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B8C39: TFile::ReadStreamerInfo() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B3D0D: TFile::Init(bool) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B999B: TFile::TFile(char const*, char const*, char const*, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62BD711: TFile::Open(char const*, char const*, char const*, int, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x7A613CC: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A60C02: TChain::GetEntries() const (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x454DDA: main (D3PDReader.cxx:10)
==6520==
==6520== 6,298 (1,440 direct, 4,858 indirect) bytes in 9 blocks are definitely lost in loss record 34,277 of 34,366
==6520== at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==6520== by 0x50755D9: TStorage::ObjectAlloc(unsigned long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x454E70: TObject::operator new(unsigned long) (TObject.h:156)
==6520== by 0x6375D50: ROOT::new_TStreamerInfo(void*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50CD00C: TClass::New(TClass::ENewType) const (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x629F5F0: TBufferFile::ReadObjectAny(TClass const*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50B4D2E: TBuffer& operator>>(TBuffer&, TObject*&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x50B9ACA: TList::Streamer(TBuffer&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x62CB166: TKey::ReadObjWithBuffer(char*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B62CC: TFile::GetStreamerInfoList() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B8C39: TFile::ReadStreamerInfo() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B3D0D: TFile::Init(bool) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B999B: TFile::TFile(char const*, char const*, char const*, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62BD711: TFile::Open(char const*, char const*, char const*, int, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x7A613CC: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A60C02: TChain::GetEntries() const (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520==
==6520== 6,298 (1,440 direct, 4,858 indirect) bytes in 9 blocks are definitely lost in loss record 34,278 of 34,366
==6520== at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==6520== by 0x50755D9: TStorage::ObjectAlloc(unsigned long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x454E70: TObject::operator new(unsigned long) (TObject.h:156)
==6520== by 0x6375D50: ROOT::new_TStreamerInfo(void*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50CD00C: TClass::New(TClass::ENewType) const (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x629F5F0: TBufferFile::ReadObjectAny(TClass const*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50B4D2E: TBuffer& operator>>(TBuffer&, TObject*&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x50B9ACA: TList::Streamer(TBuffer&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x62CB166: TKey::ReadObjWithBuffer(char*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B62CC: TFile::GetStreamerInfoList() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B8C39: TFile::ReadStreamerInfo() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B3D0D: TFile::Init(bool) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B999B: TFile::TFile(char const*, char const*, char const*, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62BD711: TFile::Open(char const*, char const*, char const*, int, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x7A613CC: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A60C5B: TChain::GetEntry(long long, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x454E25: main (D3PDReader.cxx:12)
==6520==
==6520== 321,198 (73,440 direct, 247,758 indirect) bytes in 459 blocks are definitely lost in loss record 34,365 of 34,366
==6520== at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==6520== by 0x50755D9: TStorage::ObjectAlloc(unsigned long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x454E70: TObject::operator new(unsigned long) (TObject.h:156)
==6520== by 0x6375D50: ROOT::new_TStreamerInfo(void*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50CD00C: TClass::New(TClass::ENewType) const (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x629F5F0: TBufferFile::ReadObjectAny(TClass const*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x50B4D2E: TBuffer& operator>>(TBuffer&, TObject*&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x50B9ACA: TList::Streamer(TBuffer&) (in /usr/local/root-v5.26.00-gcc3.4/lib/libCore.so)
==6520== by 0x62CB166: TKey::ReadObjWithBuffer(char*) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B62CC: TFile::GetStreamerInfoList() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B8C39: TFile::ReadStreamerInfo() (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B3D0D: TFile::Init(bool) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62B999B: TFile::TFile(char const*, char const*, char const*, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x62BD711: TFile::Open(char const*, char const*, char const*, int, int) (in /usr/local/root-v5.26.00-gcc3.4/lib/libRIO.so)
==6520== by 0x7A613CC: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520== by 0x7A61CED: TChain::LoadTree(long long) (in /usr/local/root-v5.26.00-gcc3.4/lib/libTree.so)
==6520==
==6520== LEAK SUMMARY:
==6520== definitely lost: 83,774 bytes in 682 blocks
==6520== indirectly lost: 184,680 bytes in 1,539 blocks
==6520== possibly lost: 856 bytes in 11 blocks
==6520== still reachable: 5,919,754 bytes in 41,814 blocks
==6520== suppressed: 440,695 bytes in 9,160 blocks
==6520== Reachable blocks (those to which a pointer was found) are not shown.
==6520== To see them, rerun with: --leak-check=full --show-reachable=yes
==6520==
==6520== ERROR SUMMARY: 24 errors from 24 contexts (suppressed: 1660 from 1660)
–6520–
–6520-- used_suppression: 1559 TString generated by ROOT
–6520-- used_suppression: 182 Array of objects allocated in TStreamerInfo::Compile
–6520-- used_suppression: 53 TClass::fStreamerInfo’s storage
–6520-- used_suppression: 26 std::string uses in various place.
–6520-- used_suppression: 16 TClass’s list of base classes (G__DataMemberInfo elements)
–6520-- used_suppression: 52 TClass::AddClass()'s std::string
–6520-- used_suppression: 1 TUnixSystem::Setenv, see its doc
–6520-- used_suppression: 18 Unloaded TClass and its fClassInfo
–6520-- used_suppression: 33 TClass::fClassInfo
–6520-- used_suppression: 4 dl-hack3
==6520==
==6520== ERROR SUMMARY: 24 errors from 24 contexts (suppressed: 1660 from 1660)