Skip to content

Commit 29c9eeb

Browse files
Fixed remaining memory leaks! Now leak free!
1 parent 9296ef1 commit 29c9eeb

File tree

2 files changed

+59
-9
lines changed

2 files changed

+59
-9
lines changed

IDAWin/SundialsSolverInterface.cpp

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,72 @@
1919
void errExit(int returnCode, const std::string &errorMsg);
2020

2121
void activateSolver(std::ifstream& inputFileStream, FILE* outputFile, int taskID) {
22+
int returnCode = 0;
23+
std::string errorMsg;
24+
VCellSolver* targetSolver;
25+
// First try block - create the solver; failure => no need to delete targetSolver!
2226
try {
23-
VCellSolver* targetSolver = VCellSolverFactory::produceVCellSolver(inputFileStream, taskID);
24-
targetSolver->solve(nullptr, true, outputFile, VCellSundialsSolver::checkStopRequested);
27+
targetSolver = VCellSolverFactory::produceVCellSolver(inputFileStream, taskID);
2528
} catch (const char *ex) {
26-
errExit(-1, ex);
29+
returnCode = -1;
30+
errorMsg = ex;
31+
targetSolver = nullptr;
2732
} catch (std::string &ex) {
28-
errExit(-2, ex);
33+
returnCode = -2;
34+
errorMsg = ex;
35+
targetSolver = nullptr;
2936
} catch (StoppedByUserException&) {
30-
errExit(0, "Execution Stopped By User");
37+
returnCode = 0;
38+
errorMsg = "Execution Stopped By User";
39+
targetSolver = nullptr;
3140
} catch (VCell::Exception &ex) {
32-
errExit(-3, ex.getMessage());
41+
returnCode = -3;
42+
errorMsg = ex.getMessage();
43+
targetSolver = nullptr;
3344
} catch (const std::exception& err) {
34-
errExit(-4, err.what());
45+
returnCode = -4;
46+
errorMsg = err.what();
47+
targetSolver = nullptr;
3548
} catch (...) {
36-
errExit(-5, "unknown error");
49+
returnCode = -5;
50+
errorMsg = "Unknown Error Detected";
51+
targetSolver = nullptr;
52+
}
53+
// second try block - solver is created; must delete it!
54+
if (nullptr != targetSolver) {
55+
try {
56+
targetSolver->solve(nullptr, true, outputFile, VCellSundialsSolver::checkStopRequested);
57+
} catch (const char *ex) {
58+
returnCode = -1;
59+
errorMsg = ex;
60+
// errExit(-1, ex);
61+
} catch (std::string &ex) {
62+
returnCode = -2;
63+
errorMsg = ex;
64+
} catch (StoppedByUserException&) {
65+
returnCode = 0;
66+
errorMsg = "Execution Stopped By User";
67+
} catch (VCell::Exception &ex) {
68+
returnCode = -3;
69+
errorMsg = ex.getMessage();
70+
} catch (const std::exception& err) {
71+
returnCode = -4;
72+
errorMsg = err.what();
73+
} catch (...) {
74+
returnCode = -5;
75+
errorMsg = "Unknown Error Detected";
76+
}
77+
// !!! DELETE THE SOLVER !!!
78+
delete targetSolver;
3779
}
3880

3981
// cleanup
4082
if (SimulationMessaging::getInstVar() != nullptr) {
4183
SimulationMessaging::getInstVar()->waitUntilFinished();
4284
delete SimulationMessaging::getInstVar();
4385
}
86+
87+
if (!errorMsg.empty()) errExit(returnCode, errorMsg);
4488
}
4589

4690
void errExit(int returnCode, const std::string &errorMsg) {

IDAWin/VCellSolverFactory.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ VCellSolver* VCellSolverFactory::produceVCellSolver(std::ifstream& inputFileStre
4343
default:
4444
throw new VCell::Exception("Unknown VCellSolver type");
4545
}
46-
desiredSolver->configureFromInput(inputBreakdown);
46+
try {
47+
desiredSolver->configureFromInput(inputBreakdown);
48+
} catch (...) {
49+
delete desiredSolver;
50+
throw;
51+
}
52+
4753
return desiredSolver;
4854
}
4955

0 commit comments

Comments
 (0)