Skip to content

Commit 6b87e81

Browse files
authored
Merge pull request #159 from zhaozhiwen/fix/132-text-stream-leak
Return the ASCII system stream as unique_ptr to stop a per-load leak
2 parents 4e04c67 + 7fc3555 commit 6b87e81

4 files changed

Lines changed: 10 additions & 7 deletions

File tree

gemc/gsystem/gsystemFactories/text/loadGeometry.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ void GSystemTextFactory::loadGeometry(GSystem* system) {
3434
gutilities::getStringVectorFromStringWithDelimiter(dbline, "|");
3535
system->addGVolume(gvolumePars);
3636
}
37-
38-
IN->close();
37+
// IN (unique_ptr<ifstream>) closes the file and frees the stream on scope exit.
3938
}
4039
}

gemc/gsystem/gsystemFactories/text/loadMaterials.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ void GSystemTextFactory::loadMaterials(GSystem* system) {
2828
gutilities::getStringVectorFromStringWithDelimiter(dbline, "|");
2929
system->addGMaterial(gmaterialsPars);
3030
}
31-
32-
IN->close();
31+
// IN (unique_ptr<ifstream>) closes the file and frees the stream on scope exit.
3332
}
3433
}

gemc/gsystem/gsystemFactories/text/systemTextFactory.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,21 @@
1414

1515
// cpp
1616
#include <fstream>
17+
#include <memory>
1718

1819
// returns the file stream, checking all possible directories.
1920
// SYSTEMTYPE can be:
2021
// - GTEXTGEOMTYPE (mandatory, exit if not found)
2122
// - GTEXTMATSTYPE
22-
std::ifstream* GSystemTextFactory::gSystemTextFileStream(GSystem* system, const std::string& SYSTEMTYPE) {
23+
std::unique_ptr<std::ifstream> GSystemTextFactory::gSystemTextFileStream(GSystem* system, const std::string& SYSTEMTYPE) {
2324
std::string fileName = system->getFilePath();
2425
std::string variation = system->getVariation();
2526
std::string fname = fileName + SYSTEMTYPE + variation + ".txt";
2627

2728
log->info(0, "gSystemTextFileStream filename is: ", fname);
2829

2930
// default dir is "."
30-
auto IN = new std::ifstream(fname.c_str());
31+
auto IN = std::make_unique<std::ifstream>(fname.c_str());
3132

3233
if (IN->good()) {
3334
log->info(1, "Trying file ", fname);

gemc/gsystem/gsystemFactories/text/systemTextFactory.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
// gsystem
44
#include <gemc/gsystem/gsystemFactories/systemFactory.h>
55

6+
// c++
7+
#include <fstream>
8+
#include <memory>
9+
610
// file types
711
#define GTEXTGEOMTYPE "__geometry_"
812
#define GTEXTMATSTYPE "__materials_"
@@ -76,5 +80,5 @@ class GSystemTextFactory : public GSystemFactory
7680
* - For geometry, failure to locate a file triggers an error unless \c system->getAnnotations() is \c "mats_only".
7781
* - For materials, failure to locate a file is treated as "no materials provided".
7882
*/
79-
std::ifstream* gSystemTextFileStream(GSystem* system, const std::string& SYSTEMTYPE);
83+
std::unique_ptr<std::ifstream> gSystemTextFileStream(GSystem* system, const std::string& SYSTEMTYPE);
8084
};

0 commit comments

Comments
 (0)