Memory leak in RooProdPdf::processProductTerm?

Hello,
running HypoTestInverter on the model defined via workspace I observe significant
(actually killing) memory leak of ~200K/toy.
Valgrind reports a suspicions in RooProdPdf::processProductTerm:


==25455== 21,005,312 bytes in 20,513 blocks are possibly lost in loss record 78,202 of 78,202
==25455== at 0x402398C: operator new[](unsigned long) (vg_replace_malloc.c:305)
==25455== by 0xEC265FF: RooNameSet::RooNameSet() (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEC26B74: RooNormSetCache::RooNormSetCache(int) (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEC341C0: RooCacheManager::RooCacheManager(RooAbsArg*, int) (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEC33BD8: RooObjCacheManager::RooObjCacheManager(RooAbsArg*, int, bool) (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEC51E27: RooProduct::RooProduct(char const*, char const*, RooArgSet const&) (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEC44DEB: RooProdPdf::processProductTerm(RooArgSet const*, RooArgSet const*, char const*, RooArgSet const*, RooArgSet const&, RooArgSet const&, bool&, bool) const (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEC4C16F: RooProdPdf::getPartIntList(RooArgSet const*, RooArgSet const*, RooArgList*&, RooLinkedList*&, int&, char const*) const (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEC50103: RooProdPdf::evaluate() const (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEB1C7AB: RooAbsPdf::getVal(RooArgSet const*) const (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEC614A6: RooRealIntegral::evaluate() const (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)
==25455== by 0xEB2882A: RooAbsReal::traceEval(RooArgSet const*) const (in /afs/cern.ch/cms/slc5_amd64_gcc434/lcg/roofit/5.30.00/lib/libRooFitCore.so)

In the RooProdPdf::processProductTerm code there is a suspicious fragment indeed:


} else {

  // CASE IIIb: Normalized and partially integrated composite PDF term
  //---------------------------------------------------------------

  // Use auxiliary class RooGenProdProj to calculate this term
  const char* name = makeRGPPName("GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
  RooAbsReal* partInt = new RooGenProdProj(name,name,*term,termISet,termNSet,isetRangeName) ;
  partInt->setStringAttribute("PROD_TERM_TYPE","IIIb") ;
  //partInt->setOperMode(operMode()) ;

  //cout << "processProductTerm(" << GetName() << ") case IIIb func = " << partInt->GetName() << endl ;
  
  isOwned=kTRUE ;
  ret[0] = partInt ;
  
  const char* name1 = makeRGPPName("PROD",*term,RooArgSet(),RooArgSet(),0) ;

  // WVE FIX THIS
  RooProduct* tmp_prod = new RooProduct(name1,name1,*term) ;
  
  ret[1] = tmp_prod->createIntegral(termISet,isetRangeName) ;
  ret[2] = tmp_prod->createIntegral(termNSet,normRange()) ;

  return ret ;
}

It’s not obvious who is going to take care of deleting tmp_prod RooProduct object created in this fragment.

If this could be a reason for the leak, what is the work around?

Cheers,
-Fedor