Skip to content

Commit caada27

Browse files
author
Dilawar Singh
committed
Fixed all memory leaks. Probably I don't understand how EXPRTK really
works. using smart pointers with EXPRTK caused memory leak.
1 parent 82a4082 commit caada27

File tree

5 files changed

+30
-23
lines changed

5 files changed

+30
-23
lines changed

builtins/MooseParser.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ using namespace std;
2323
namespace moose
2424
{
2525

26-
MooseParser::MooseParser() :
27-
expression_(new moose::Parser::expression_t())
28-
, symbol_tables_registered_(false)
26+
MooseParser::MooseParser()
2927
{
3028
Parser::symbol_table_t symbol_table;
3129

@@ -39,13 +37,14 @@ MooseParser::MooseParser() :
3937
symbol_table.add_function( "srand2", MooseParser::SRand2 );
4038
symbol_table.add_function( "fmod", MooseParser::Fmod );
4139

42-
expression_->register_symbol_table(symbol_table);
40+
expression_.register_symbol_table(symbol_table);
4341

4442
}
4543

4644
MooseParser::~MooseParser()
4745
{
48-
expression_->release();
46+
ClearAll();
47+
expression_.release();
4948
}
5049

5150
/*-----------------------------------------------------------------------------
@@ -89,11 +88,17 @@ double MooseParser::Fmod( double a, double b )
8988
/*-----------------------------------------------------------------------------
9089
* Get/Set
9190
*-----------------------------------------------------------------------------*/
92-
Parser::symbol_table_t& MooseParser::GetSymbolTable( ) const
91+
Parser::symbol_table_t& MooseParser::GetSymbolTable()
9392
{
94-
return expression_->get_symbol_table();
93+
return expression_.get_symbol_table();
9594
}
9695

96+
const Parser::symbol_table_t& MooseParser::GetSymbolTable() const
97+
{
98+
return expression_.get_symbol_table();
99+
}
100+
101+
97102
double MooseParser::GetVarValue(const string& name) const
98103
{
99104
return GetSymbolTable().get_variable(name)->value();
@@ -211,7 +216,7 @@ bool MooseParser::CompileExpr()
211216
ASSERT_FALSE(expr_.empty(), __func__ << ": Empty expression not allowed here");
212217

213218
Parser::parser_t parser;
214-
auto res = parser.compile(expr_, *expression_);
219+
auto res = parser.compile(expr_, expression_);
215220
if(! res)
216221
{
217222
std::stringstream ss;
@@ -240,14 +245,14 @@ bool MooseParser::CompileExpr()
240245

241246
double MooseParser::Derivative(const string& name) const
242247
{
243-
return exprtk::derivative(*expression_, name);
248+
return exprtk::derivative(expression_, name);
244249
}
245250

246251
double MooseParser::Eval(bool check) const
247252
{
248253
if( expr_.empty())
249254
return 0.0;
250-
double v = expression_->value();
255+
double v = expression_.value();
251256
if(check)
252257
{
253258
if(! std::isfinite(v))
@@ -289,7 +294,7 @@ void MooseParser::ClearAll( )
289294

290295
void MooseParser::Reset( )
291296
{
292-
expression_->release();
297+
expression_.release();
293298
}
294299

295300
const string MooseParser::GetExpr( ) const

builtins/MooseParser.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ class MooseParser
6060
/*-----------------------------------------------------------------------------
6161
* Set/Get
6262
*-----------------------------------------------------------------------------*/
63-
Parser::symbol_table_t& GetSymbolTable( ) const;
63+
Parser::symbol_table_t& GetSymbolTable();
64+
const Parser::symbol_table_t& GetSymbolTable() const;
6465

6566
void SetSymbolTable( Parser::symbol_table_t tab );
6667

@@ -122,9 +123,8 @@ class MooseParser
122123
/* Map to variable names and pointer to their values. */
123124
// map<string, double*> refs_;
124125

125-
Parser::expression_t* expression_; /* expression type */
126+
Parser::expression_t expression_; /* expression type */
126127
size_t num_user_defined_funcs_ = 0;
127-
128128
bool symbol_tables_registered_;
129129
};
130130

ksolve/FuncTerm.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,20 @@ FuncTerm::FuncTerm():
3333

3434
FuncTerm::~FuncTerm()
3535
{
36+
if(args_)
37+
delete[] args_;
3638
}
3739

3840
void FuncTerm::setReactantIndex( const vector< unsigned int >& mol )
3941
{
4042
reactantIndex_ = mol;
4143
if ( args_ )
4244
{
43-
parser_.Reset();
44-
// parser_.ClearAll();
45+
delete[] args_;
46+
parser_.ClearAll();
4547
}
4648

47-
args_.reset(new double[mol.size()+1]);
49+
args_ = new double[mol.size()+1];
4850
for ( unsigned int i = 0; i < mol.size(); ++i )
4951
{
5052
args_[i] = 0.0;
@@ -123,7 +125,7 @@ double FuncTerm::getVolScale() const
123125

124126
const FuncTerm& FuncTerm::operator=( const FuncTerm& other )
125127
{
126-
args_ = nullptr;
128+
args_ = nullptr; // other is still using it.
127129
expr_ = other.expr_;
128130
volScale_ = other.volScale_;
129131
target_ = other.target_;
@@ -139,7 +141,7 @@ const FuncTerm& FuncTerm::operator=( const FuncTerm& other )
139141
*/
140142
double FuncTerm::operator() ( const double* S, double t ) const
141143
{
142-
if ( ! args_.get() )
144+
if ( ! args_ )
143145
return 0.0;
144146

145147
unsigned int i = 0;
@@ -160,7 +162,7 @@ double FuncTerm::operator() ( const double* S, double t ) const
160162

161163
void FuncTerm::evalPool( double* S, double t ) const
162164
{
163-
if ( !args_.get() || target_ == ~0U )
165+
if ( !args_ || target_ == ~0U )
164166
return;
165167

166168
unsigned int i;

ksolve/FuncTerm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class FuncTerm
5353
double volScale_;
5454
unsigned int target_; /// Index of the entity to be updated by Func
5555

56-
unique_ptr<double[]> args_;
56+
double* args_;
5757

5858
string expr_;
5959
moose::MooseParser parser_;

tests/py_rdesigneur/test_72_CICR.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ def test():
8585
# print(np.array_repr(s))
8686
# In multithreaded mode, the numers are not exactly the same as in
8787
# expected.
88-
assert np.allclose(m, E[0], rtol=1e-2), (m - E[0])
89-
assert np.allclose(s, E[1], rtol=1e-2), (s - E[1])
88+
assert np.allclose(m, E[0], rtol=1e-2, atol=1e-4), (m - E[0])
89+
assert np.allclose(s, E[1], rtol=1e-2, atol=1e-4), (s - E[1])
9090
print('done')
9191

9292

0 commit comments

Comments
 (0)