From 1feed7116a3b8552a8b29d24a60094b503544a10 Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Fri, 13 Oct 2023 22:46:01 +0200 Subject: [PATCH 1/2] replaced raw pointers by smart pointers for musrFT.cpp. --- src/musrFT.cpp | 101 ++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 52 deletions(-) diff --git a/src/musrFT.cpp b/src/musrFT.cpp index d661b146..7ab5ac81 100644 --- a/src/musrFT.cpp +++ b/src/musrFT.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -1030,40 +1031,30 @@ Int_t main(Int_t argc, Char_t *argv[]) PStartupOptions startup_options; startup_options.writeExpectedChisq = false; startup_options.estimateN0 = true; - TSAXParser *saxParser = new TSAXParser(); - PStartupHandler *startupHandler = new PStartupHandler(); + std::unique_ptr saxParser = std::unique_ptr(new TSAXParser()); + if (saxParser == nullptr) { + std::cerr << ">> musrFT: **ERROR** couldn't invoke TSAXParser object" << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } + std::unique_ptr startupHandler = std::unique_ptr(new PStartupHandler()); + if (startupHandler == nullptr) { + std::cerr << ">> musrFT: **ERROR** couldn't invoke PStartupHandler object" << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } if (!startupHandler->StartupFileFound()) { std::cerr << std::endl << ">> musrFT **WARNING** couldn't find " << startupHandler->GetStartupFilePath().Data(); std::cerr << std::endl; - // clean up - if (saxParser) { - delete saxParser; - saxParser = nullptr; - } - if (startupHandler) { - delete startupHandler; - startupHandler = nullptr; - } } else { strcpy(startup_path_name, startupHandler->GetStartupFilePath().Data()); - saxParser->ConnectToHandler("PStartupHandler", startupHandler); + saxParser->ConnectToHandler("PStartupHandler", startupHandler.get()); //status = saxParser->ParseFile(startup_path_name); // parsing the file as above seems to lead to problems in certain environments; // use the parseXmlFile function instead (see PStartupHandler.cpp for the definition) - status = parseXmlFile(saxParser, startup_path_name); + status = parseXmlFile(saxParser.get(), startup_path_name); // check for parse errors if (status) { // error std::cerr << std::endl << ">> musrFT **WARNING** Reading/parsing musrfit_startup.xml failed."; std::cerr << std::endl; - // clean up - if (saxParser) { - delete saxParser; - saxParser = nullptr; - } - if (startupHandler) { - delete startupHandler; - startupHandler = nullptr; - } } } @@ -1071,10 +1062,14 @@ Int_t main(Int_t argc, Char_t *argv[]) PPrepFourier data(startupParam.packing, startupParam.bkg_range, startupParam.bkg); // load msr-file(s) - std::vector msrHandler; + std::vector< std::unique_ptr > msrHandler; msrHandler.resize(startupParam.msrFln.size()); for (UInt_t i=0; i(new PMsrHandler(startupParam.msrFln[i].Data(), &startup_options, true)); + if (msrHandler[i] == nullptr) { + std::cerr << ">> musrFT: **ERROR** couldn't invoke PMsrHandler object" << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } status = msrHandler[i]->ReadMsrFile(); if (status != PMUSR_SUCCESS) { switch (status) { @@ -1092,24 +1087,34 @@ Int_t main(Int_t argc, Char_t *argv[]) } } - std::vector runDataHandler; + std::vector< std::unique_ptr > runDataHandler; runDataHandler.resize(startupParam.msrFln.size()+startupParam.dataFln.size()); // resize to the total number of run data provided // load data-file(s) related to msr-file for (UInt_t i=0; iGetDataPathList()); + runDataHandler[i] = std::unique_ptr(new PRunDataHandler(msrHandler[i].get(), startupHandler->GetDataPathList())); else - runDataHandler[i] = new PRunDataHandler(msrHandler[i]); + runDataHandler[i] = std::unique_ptr(new PRunDataHandler(msrHandler[i].get())); + + if (runDataHandler[i] == nullptr) { + std::cerr << ">> musrFT: **ERROR** couldn't invoke PRunDataHandler object" << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } } // load data-file(s) provided directly for (UInt_t i=msrHandler.size(); iGetDataPathList()); + runDataHandler[i] = std::unique_ptr(new PRunDataHandler(startupParam.dataFln[i-msrHandler.size()], startupParam.dataFileFormat[i-msrHandler.size()], startupHandler->GetDataPathList())); else - runDataHandler[i] = new PRunDataHandler(startupParam.dataFln[i-msrHandler.size()], startupParam.dataFileFormat[i-msrHandler.size()]); + runDataHandler[i] = std::unique_ptr(new PRunDataHandler(startupParam.dataFln[i-msrHandler.size()], startupParam.dataFileFormat[i-msrHandler.size()])); + + if (runDataHandler[i] == nullptr) { + std::cerr << ">> musrFT: **ERROR** couldn't invoke PRunDataHandler object" << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } } // read all the data files @@ -1288,7 +1293,7 @@ Int_t main(Int_t argc, Char_t *argv[]) // handle data set(s) // group forward histos - if (musrFT_groupHistos(runDataHandler[i], global, runs->at(runList[j]-1), rd)) { + if (musrFT_groupHistos(runDataHandler[i].get(), global, runs->at(runList[j]-1), rd)) { return PMUSR_DATA_FILE_READ_ERROR; } // keep data set @@ -1412,6 +1417,10 @@ Int_t main(Int_t argc, Char_t *argv[]) fourier.resize(histo.size()); for (UInt_t i=0; i> musrFT: **ERROR** couldn't invoke PFourier object" << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } } // Fourier transform data @@ -1435,7 +1444,7 @@ Int_t main(Int_t argc, Char_t *argv[]) startupParam.fourierRange[1] = fourier[0]->GetMaxFreq(); } - PFourierCanvas *fourierCanvas = nullptr; + std::unique_ptr fourierCanvas; // if Fourier dumped if whished do it now if (startupParam.dumpFln.Length() > 0) { @@ -1455,19 +1464,23 @@ Int_t main(Int_t argc, Char_t *argv[]) TApplication app("App", &argc, argv); if (startupHandler) { - fourierCanvas = new PFourierCanvas(fourier, dataSetTag, startupParam.title.Data(), + fourierCanvas = std::unique_ptr(new PFourierCanvas(fourier, dataSetTag, startupParam.title.Data(), startupParam.showAverage, startupParam.showAveragePerDataSet, fourierPlotTag, startupParam.fourierRange, startupParam.initialPhase, 10, 10, 800, 800, startupHandler->GetMarkerList(), startupHandler->GetColorList(), - batch); + batch)); } else { - fourierCanvas = new PFourierCanvas(fourier, dataSetTag, startupParam.title.Data(), + fourierCanvas = std::unique_ptr(new PFourierCanvas(fourier, dataSetTag, startupParam.title.Data(), startupParam.showAverage, startupParam.showAveragePerDataSet, fourierPlotTag, startupParam.fourierRange, startupParam.initialPhase, 10, 10, 800, 800, - batch); + batch)); + } + if (fourierCanvas == nullptr) { + std::cerr << ">> musrFT: **ERROR** couldn't invoke PFourierCanvas object." << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; } fourierCanvas->UpdateFourierPad(); @@ -1480,7 +1493,7 @@ Int_t main(Int_t argc, Char_t *argv[]) ok = false; } else { // connect signal/slot - TQObject::Connect("TCanvas", "Closed()", "PFourierCanvas", fourierCanvas, "LastCanvasClosed()"); + TQObject::Connect("TCanvas", "Closed()", "PFourierCanvas", fourierCanvas.get(), "LastCanvasClosed()"); fourierCanvas->SetTimeout(startupParam.timeout); @@ -1509,22 +1522,6 @@ Int_t main(Int_t argc, Char_t *argv[]) // cleanup - if (fourierCanvas) - delete fourierCanvas; - - if (startupHandler) - delete startupHandler; - - for (UInt_t i=0; i 0) { for (UInt_t i=0; i Date: Fri, 13 Oct 2023 22:46:21 +0200 Subject: [PATCH 2/2] replaced raw pointers by smart pointers for musrt0.cpp. --- src/musrt0.cpp | 133 ++++++++++++++----------------------------------- 1 file changed, 38 insertions(+), 95 deletions(-) diff --git a/src/musrt0.cpp b/src/musrt0.cpp index c6010fec..7d7c6cb3 100644 --- a/src/musrt0.cpp +++ b/src/musrt0.cpp @@ -36,6 +36,7 @@ #include #include +#include #include #include @@ -94,7 +95,7 @@ void musrt0_syntax() */ Bool_t musrt0_item(TApplication &app, PMsrHandler *msrHandler, PMusrT0Data &data, UInt_t idx, Int_t timeout) { - PMusrT0 *musrT0 = new PMusrT0(data); + std::unique_ptr musrT0 = std::unique_ptr(new PMusrT0(data)); // check if the musrT0 object could be invoked if (musrT0 == nullptr) { @@ -137,45 +138,11 @@ Bool_t musrt0_item(TApplication &app, PMsrHandler *msrHandler, PMusrT0Data &data result = true; // disconnect all SIGNALS and SLOTS connected t0 musrT0 - musrT0->Disconnect(musrT0); - - // cleanup - delete musrT0; - musrT0 = nullptr; + musrT0->Disconnect(musrT0.get()); return result; } -//-------------------------------------------------------------------------- -/** - *

This routine cleans up the handlers. - * - * \param saxParser XML SAX parser - * \param startupHandler startup handler - * \param msrHandler msr-file handler - * \param dataHandler raw run data handler - */ -void musrt0_cleanup(TSAXParser *saxParser, PStartupHandler *startupHandler, PMsrHandler *msrHandler, PRunDataHandler *dataHandler) -{ - if (saxParser) { - delete saxParser; - saxParser = nullptr; - } - if (startupHandler) { - delete startupHandler; - startupHandler = nullptr; - } - if (msrHandler) { - delete msrHandler; - msrHandler = nullptr; - } - if (dataHandler) { - delete dataHandler; - dataHandler = nullptr; - } -} - - //-------------------------------------------------------------------------- /** *

@@ -312,45 +279,39 @@ Int_t main(Int_t argc, Char_t *argv[]) // read startup file Char_t startup_path_name[128]; - TSAXParser *saxParser = new TSAXParser(); - PStartupHandler *startupHandler = new PStartupHandler(); + std::unique_ptr saxParser = std::unique_ptr(new TSAXParser()); + if (saxParser == nullptr) { + std::cerr << ">> musrt0: **ERROR** couldn't invoke TSAXParser." << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } + std::unique_ptr startupHandler = std::unique_ptr(new PStartupHandler()); + if (startupHandler == nullptr) { + std::cerr << ">> musrt0: **ERROR** couldn't invoke PStartupHandler." << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } if (!startupHandler->StartupFileFound()) { std::cerr << std::endl << ">> musrt0 **WARNING** couldn't find " << startupHandler->GetStartupFilePath().Data(); std::cerr << std::endl; - // clean up - if (saxParser) { - delete saxParser; - saxParser = nullptr; - } - if (startupHandler) { - delete startupHandler; - startupHandler = nullptr; - } } else { strcpy(startup_path_name, startupHandler->GetStartupFilePath().Data()); - saxParser->ConnectToHandler("PStartupHandler", startupHandler); + saxParser->ConnectToHandler("PStartupHandler", startupHandler.get()); //status = saxParser->ParseFile(startup_path_name); // parsing the file as above seems to lead to problems in certain environments; // use the parseXmlFile function instead (see PStartupHandler.cpp for the definition) - status = parseXmlFile(saxParser, startup_path_name); + status = parseXmlFile(saxParser.get(), startup_path_name); // check for parse errors if (status) { // error std::cerr << std::endl << ">> musrt0 **WARNING** Reading/parsing musrfit_startup.xml failed."; std::cerr << std::endl; - // clean up - if (saxParser) { - delete saxParser; - saxParser = nullptr; - } - if (startupHandler) { - delete startupHandler; - startupHandler = nullptr; - } } } // read msr-file - PMsrHandler *msrHandler = new PMsrHandler(filename); + std::unique_ptr msrHandler = std::unique_ptr(new PMsrHandler(filename)); + if (msrHandler == nullptr) { + std::cerr << ">> musrt0: **ERROR** couldn't invoke PMsrHandler." << std::endl; + return PMUSR_MSR_ALLOCATION_ERROR; + } status = msrHandler->ReadMsrFile(); if (status != PMUSR_SUCCESS) { switch (status) { @@ -383,12 +344,12 @@ Int_t main(Int_t argc, Char_t *argv[]) } // read all the necessary runs (raw data) - PRunDataHandler *dataHandler = nullptr; + std::unique_ptr dataHandler; if (success) { if (startupHandler) - dataHandler = new PRunDataHandler(msrHandler, startupHandler->GetDataPathList()); + dataHandler = std::unique_ptr(new PRunDataHandler(msrHandler.get(), startupHandler->GetDataPathList())); else - dataHandler = new PRunDataHandler(msrHandler); + dataHandler = std::unique_ptr(new PRunDataHandler(msrHandler.get())); dataHandler->ReadData(); @@ -874,8 +835,7 @@ Int_t main(Int_t argc, Char_t *argv[]) musrT0Data.SetDetectorTag(PMUSRT0_FORWARD); musrT0Data.SetCmdTag(PMUSRT0_GET_T0_DATA_AND_BKG_RANGE); // execute cmd - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } } else { @@ -901,8 +861,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetAddRunIdx(j); // addruns - if (!musrt0_item(app, msrHandler, musrT0Data, j, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, j, timeout)) { exit(0); } } @@ -928,8 +887,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetHistoNoIdx(j); - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } } @@ -957,8 +915,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetHistoNoIdx(k); - if (!musrt0_item(app, msrHandler, musrT0Data, j, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, j, timeout)) { exit(0); } } @@ -973,8 +930,7 @@ Int_t main(Int_t argc, Char_t *argv[]) musrT0Data.SetAddT0Bin((UInt_t)runList->at(i).GetAddT0Bin(k, j), k, j); } } - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } } @@ -1002,8 +958,7 @@ Int_t main(Int_t argc, Char_t *argv[]) musrT0Data.SetDetectorTag(PMUSRT0_FORWARD); musrT0Data.SetCmdTag(PMUSRT0_GET_T0_DATA_AND_BKG_RANGE); // execute cmd - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } // feed necessary data backward @@ -1025,8 +980,7 @@ Int_t main(Int_t argc, Char_t *argv[]) musrT0Data.SetDetectorTag(PMUSRT0_BACKWARD); musrT0Data.SetCmdTag(PMUSRT0_GET_T0_DATA_AND_BKG_RANGE); // execute cmd - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } } else { @@ -1053,8 +1007,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetAddRunIdx(j); // addruns - if (!musrt0_item(app, msrHandler, musrT0Data, j, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, j, timeout)) { exit(0); } } @@ -1079,8 +1032,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetAddRunIdx(j); // addruns - if (!musrt0_item(app, msrHandler, musrT0Data, j, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, j, timeout)) { exit(0); } } @@ -1106,8 +1058,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetHistoNoIdx(j); - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } } @@ -1132,8 +1083,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetHistoNoIdx(j); - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } } @@ -1161,8 +1111,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetHistoNoIdx(k); - if (!musrt0_item(app, msrHandler, musrT0Data, j, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, j, timeout)) { exit(0); } } @@ -1190,8 +1139,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } // feed necessary data musrT0Data.SetHistoNoIdx(k); - if (!musrt0_item(app, msrHandler, musrT0Data, j, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, j, timeout)) { exit(0); } } @@ -1208,14 +1156,12 @@ Int_t main(Int_t argc, Char_t *argv[]) } musrT0Data.SetHistoNo(forwardHistos); musrT0Data.SetDetectorTag(PMUSRT0_FORWARD); - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } musrT0Data.SetHistoNo(backwardHistos); musrT0Data.SetDetectorTag(PMUSRT0_BACKWARD); - if (!musrt0_item(app, msrHandler, musrT0Data, 0, timeout)) { - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); + if (!musrt0_item(app, msrHandler.get(), musrT0Data, 0, timeout)) { exit(0); } } @@ -1248,8 +1194,5 @@ Int_t main(Int_t argc, Char_t *argv[]) // delete __temp.msr gSystem->Exec("rm __temp.msr"); - // clean up - musrt0_cleanup(saxParser, startupHandler, msrHandler, dataHandler); - return PMUSR_SUCCESS; }