Memory leak
dietmarwo opened this issue · 5 comments
In biteaux.h and biteopt.h there are "new" statements without corresponding "delete" statements.
For instance in
void updateDims( const int aParamCount, const int M = 6,
const int PopSize0 = 0 )
there is an deleteBuffers() call, but for "new CBiteOptWrap*[ OptCount ];"
there seems no corresponding delete.
This leads to a memory leak in fcmaes (where BitOpt is called here https://github.com/dietmarwo/fast-cma-es/blob/master/_fcmaescpp/biteoptimizer.cpp)
Is there a way I can prevent this leak by adapting the calling code in biteoptimizer.cpp ?
Isn't deleteBuffers() being called by the destructor
~CBiteOptDeep() automatically?
See the example below, derived from your example, just calling the optimizer
many times in a loop.
When executing the code, you see memory consumption of the process growing fast.
How can I modify this code to avoid the memory leak?
#include <stdio.h>
#include "biteopt.h"
#if !defined( sqr )
#define sqr( x ) (( x ) * ( x ))
#endif // !defined( sqr )
class CTestOpt: public CBiteOpt {
public:
CTestOpt() {
updateDims(2);
}
virtual void getMinValues(double *const p) const {
p[0] = -10.0;
p[1] = -10.0;
}
virtual void getMaxValues(double *const p) const {
p[0] = 10.0;
p[1] = 10.0;
}
virtual double optcost(const double *const p) {
const double x = p[0];
const double y = p[1];
return ( sqr( x + 2 * y - 7 ) + sqr(2 * x + y - 5));
}
};
void test() {
CBiteRnd rnd;
rnd.init(1); // Needs to be seeded with different values on each run.
CTestOpt opt;
opt.init(rnd);
for (int i = 0; i < 10000; i++) {
opt.optimize(rnd);
if (opt.getBestCost() < 0.1) {
break;
}
}
}
int main() {
for (int i = 0; i < 100000000; i++)
test();
return (0);
}
Thanks for bringing this to my attention. I've fixed memory leaks issue, updated repo.
Thks, I recommend https://valgrind.org/docs/manual/quick-start.html#quick-start.prepare under Linux
to check for this kind of issue. You get complete call stacks of all leaks.
New output is clean now, so the issue may be closed.
==1713384== Memcheck, a memory error detector
==1713384== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==1713384== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==1713384== Command: ./cpptest
==1713384==
==1713384==
==1713384== HEAP SUMMARY:
==1713384== in use at exit: 0 bytes in 0 blocks
==1713384== total heap usage: 101,001 allocs, 101,001 frees, 21,368,704 bytes allocated
==1713384==
==1713384== All heap blocks were freed -- no leaks are possible
Yes, I use a similar too - Dr.Memory.