From e485b2898ae65b78cd4208ae2f5337b703228c8a Mon Sep 17 00:00:00 2001
From: Stephan Hageboeck <stephan.hageboeck@cern.ch>
Date: Fri, 16 Apr 2021 14:56:14 +0200
Subject: [PATCH] [RF] Fix memory leak in ToyMCSampler.

Fix #7890.
---
 roofit/roostats/inc/RooStats/ToyMCImportanceSampler.h |  2 +-
 roofit/roostats/inc/RooStats/ToyMCSampler.h           | 10 +++++-----
 roofit/roostats/src/ToyMCSampler.cxx                  |  2 --
 3 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/roofit/roostats/inc/RooStats/ToyMCImportanceSampler.h b/roofit/roostats/inc/RooStats/ToyMCImportanceSampler.h
index c306c0a0a59..07900b37897 100644
--- a/roofit/roostats/inc/RooStats/ToyMCImportanceSampler.h
+++ b/roofit/roostats/inc/RooStats/ToyMCImportanceSampler.h
@@ -106,7 +106,7 @@ class ToyMCImportanceSampler: public ToyMCSampler {
          }
 
          if( p == NULL && fNullDensities.size() >= 1 ) p = fNullDensities[0];
-         if( s == NULL ) s = fParametersForTestStat;
+         if( s == NULL ) s = fParametersForTestStat.get();
          if( s ) s = (const RooArgSet*)s->snapshot();
 
          fNullDensities.push_back( p );
diff --git a/roofit/roostats/inc/RooStats/ToyMCSampler.h b/roofit/roostats/inc/RooStats/ToyMCSampler.h
index 9f42674b1d3..372223dfc4c 100644
--- a/roofit/roostats/inc/RooStats/ToyMCSampler.h
+++ b/roofit/roostats/inc/RooStats/ToyMCSampler.h
@@ -31,9 +31,10 @@
 #include "RooMsgService.h"
 #include "RooAbsPdf.h"
 #include "RooRealVar.h"
-
 #include "RooDataSet.h"
 
+#include <memory>
+
 namespace RooStats {
 
   class DetailedOutputAggregator;
@@ -155,8 +156,7 @@ class ToyMCSampler: public TestStatSampler {
 
       // Set the Pdf, add to the the workspace if not already there
       virtual void SetParametersForTestStat(const RooArgSet& nullpoi) {
-         if( fParametersForTestStat ) delete fParametersForTestStat;
-         fParametersForTestStat = (const RooArgSet*)nullpoi.snapshot();
+         fParametersForTestStat.reset( nullpoi.snapshot() );
       }
 
       virtual void SetPdf(RooAbsPdf& pdf) { fPdf = &pdf; ClearCache(); }
@@ -249,7 +249,7 @@ class ToyMCSampler: public TestStatSampler {
 
       // densities, snapshots, and test statistics to reweight to
       RooAbsPdf *fPdf; // model (can be alt or null)
-      const RooArgSet* fParametersForTestStat;
+      std::unique_ptr<const RooArgSet> fParametersForTestStat;
       std::vector<TestStatistic*> fTestStatistics;
 
       std::string fSamplingDistName; // name of the model
@@ -296,7 +296,7 @@ class ToyMCSampler: public TestStatSampler {
       Bool_t fUseMultiGen ; // Use PrepareMultiGen?
 
    protected:
-   ClassDef(ToyMCSampler,3) // A simple implementation of the TestStatSampler interface
+   ClassDef(ToyMCSampler, 4) // A simple implementation of the TestStatSampler interface
 };
 }
 
diff --git a/roofit/roostats/src/ToyMCSampler.cxx b/roofit/roostats/src/ToyMCSampler.cxx
index 245ea16f754..c6e75a31a15 100644
--- a/roofit/roostats/src/ToyMCSampler.cxx
+++ b/roofit/roostats/src/ToyMCSampler.cxx
@@ -154,7 +154,6 @@ ToyMCSampler::ToyMCSampler() : fSamplingDistName("SD"), fNToys(1)
 {
 
    fPdf = NULL;
-   fParametersForTestStat = NULL;
    fPriorNuisance = NULL;
    fNuisancePars = NULL;
    fObservables = NULL;
@@ -194,7 +193,6 @@ ToyMCSampler::ToyMCSampler() : fSamplingDistName("SD"), fNToys(1)
 ToyMCSampler::ToyMCSampler(TestStatistic &ts, Int_t ntoys) : fSamplingDistName(ts.GetVarName().Data()), fNToys(ntoys)
 {
    fPdf = NULL;
-   fParametersForTestStat = NULL;
    fPriorNuisance = NULL;
    fNuisancePars = NULL;
    fObservables = NULL;
-- 
GitLab