(read_binary_journal): Fixed a tiny memory leak when reading from a

binary cache.
This commit is contained in:
John Wiegley 2006-02-28 13:06:38 +00:00
parent 2930b89ea3
commit 9db08c4c7d
6 changed files with 29 additions and 17 deletions

View file

@ -557,6 +557,7 @@ unsigned int read_binary_journal(std::istream& in,
account_t::ident_t a_count = read_binary_long<account_t::ident_t>(data); account_t::ident_t a_count = read_binary_long<account_t::ident_t>(data);
accounts = accounts_next = new account_t *[a_count]; accounts = accounts_next = new account_t *[a_count];
delete journal->master;
journal->master = read_binary_account(data, journal, master); journal->master = read_binary_account(data, journal, master);
if (read_binary_number<bool>(data)) if (read_binary_number<bool>(data))
journal->basket = accounts[read_binary_long<account_t::ident_t>(data) - 1]; journal->basket = accounts[read_binary_long<account_t::ident_t>(data) - 1];

View file

@ -309,7 +309,7 @@ void auto_entry_t::extend_entry(entry_base_t& entry)
account_t::~account_t() account_t::~account_t()
{ {
DEBUG_PRINT("ledger.memory.dtors", "dtor account_t"); DEBUG_PRINT("ledger.memory.dtors", "dtor account_t " << this);
//assert(! data); //assert(! data);
for (accounts_map::iterator i = accounts.begin(); for (accounts_map::iterator i = accounts.begin();

View file

@ -283,9 +283,8 @@ class account_t
const std::string& _note = "") const std::string& _note = "")
: parent(_parent), name(_name), note(_note), : parent(_parent), name(_name), note(_note),
depth(parent ? parent->depth + 1 : 0), data(NULL), ident(0) { depth(parent ? parent->depth + 1 : 0), data(NULL), ident(0) {
DEBUG_PRINT("ledger.memory.ctors", "ctor account_t"); DEBUG_PRINT("ledger.memory.ctors", "ctor account_t " << this);
} }
~account_t(); ~account_t();
bool operator==(const account_t& account) { bool operator==(const account_t& account) {

View file

@ -44,7 +44,7 @@ bool compute_amount(value_expr_t * expr, amount_t& amt,
value_expr_t::~value_expr_t() value_expr_t::~value_expr_t()
{ {
DEBUG_PRINT("ledger.memory.dtors", "dtor value_expr_t"); DEBUG_PRINT("ledger.memory.dtors", "dtor value_expr_t " << this);
DEBUG_PRINT("ledger.valexpr.memory", "Destroying " << this); DEBUG_PRINT("ledger.valexpr.memory", "Destroying " << this);
assert(refc == 0); assert(refc == 0);
@ -1279,7 +1279,8 @@ void init_value_expr()
globals->define("P", node); globals->define("P", node);
globals->define("val", node); globals->define("val", node);
globals->define("value", node); globals->define("value", node);
parse_boolean_expr("current_value(x)=P(x,m)", globals); node = parse_boolean_expr("current_value(x)=P(x,m)", globals);
delete node;
// Macros // Macros
node = parse_value_expr("P(a,d)"); node = parse_value_expr("P(a,d)");
@ -1298,8 +1299,10 @@ void init_value_expr()
globals->define("G", node); globals->define("G", node);
globals->define("gain_total", node); globals->define("gain_total", node);
parse_boolean_expr("min(x,y)=x<y?x:y", globals); node = parse_boolean_expr("min(x,y)=x<y?x:y", globals);
parse_boolean_expr("max(x,y)=x>y?x:y", globals); delete node;
node = parse_boolean_expr("max(x,y)=x>y?x:y", globals);
delete node;
} }
value_expr_t * parse_value_expr(std::istream& in, scope_t * scope, value_expr_t * parse_value_expr(std::istream& in, scope_t * scope,

View file

@ -151,7 +151,10 @@ struct value_expr_t
value_expr_t(const kind_t _kind) value_expr_t(const kind_t _kind)
: kind(_kind), refc(0), left(NULL), right(NULL) { : kind(_kind), refc(0), left(NULL), right(NULL) {
DEBUG_PRINT("ledger.memory.ctors", "ctor value_expr_t"); DEBUG_PRINT("ledger.memory.ctors", "ctor value_expr_t " << this);
}
value_expr_t(const value_expr_t&) {
DEBUG_PRINT("ledger.memory.ctors", "ctor value_expr_t (copy) " << this);
} }
~value_expr_t(); ~value_expr_t();
@ -203,8 +206,11 @@ struct scope_t
symbol_map symbols; symbol_map symbols;
scope_t(scope_t * _parent = NULL) : parent(_parent) {} scope_t(scope_t * _parent = NULL) : parent(_parent) {
DEBUG_PRINT("ledger.memory.ctors", "ctor scope_t");
}
~scope_t() { ~scope_t() {
DEBUG_PRINT("ledger.memory.dtors", "dtor scope_t");
for (symbol_map::iterator i = symbols.begin(); for (symbol_map::iterator i = symbols.begin();
i != symbols.end(); i != symbols.end();
i++) i++)
@ -328,6 +334,7 @@ class value_expr : public value_calc
public: public:
value_expr(const std::string& _expr) : expr(_expr) { value_expr(const std::string& _expr) : expr(_expr) {
DEBUG_PRINT("ledger.memory.ctors", "ctor value_expr");
try { try {
parsed = parse_value_expr(expr); parsed = parse_value_expr(expr);
parsed->acquire(); parsed->acquire();
@ -337,9 +344,11 @@ public:
expr + "': " + err.what()); expr + "': " + err.what());
} }
} }
value_expr(value_expr_t * _parsed) : parsed(_parsed->acquire()) {} value_expr(value_expr_t * _parsed) : parsed(_parsed->acquire()) {
DEBUG_PRINT("ledger.memory.ctors", "ctor value_expr");
}
virtual ~value_expr() { virtual ~value_expr() {
DEBUG_PRINT("ledger.memory.dtors", "dtor value_expr");
if (parsed != NULL) if (parsed != NULL)
parsed->release(); parsed->release();
} }