diff options
author | John Wiegley <johnw@newartisans.com> | 2009-02-21 03:48:02 -0400 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2009-02-21 03:48:02 -0400 |
commit | aeea1cb3e1c5c158294e1f08543065c2e602c94e (patch) | |
tree | 6faa36fab7bd2c2c2b04046a493a60e0ca9eee6b | |
parent | 5d50d895bf4aaa139c4b632820b661de383b2ef3 (diff) | |
download | fork-ledger-aeea1cb3e1c5c158294e1f08543065c2e602c94e.tar.gz fork-ledger-aeea1cb3e1c5c158294e1f08543065c2e602c94e.tar.bz2 fork-ledger-aeea1cb3e1c5c158294e1f08543065c2e602c94e.zip |
Fixed a memory leak in value_t::storage_t
-rw-r--r-- | src/value.cc | 4 | ||||
-rw-r--r-- | src/value.h | 28 |
2 files changed, 18 insertions, 14 deletions
diff --git a/src/value.cc b/src/value.cc index a7d3c7e5..90067bba 100644 --- a/src/value.cc +++ b/src/value.cc @@ -119,7 +119,7 @@ void value_t::set_type(type_t new_type) if (! storage || storage->refc > 1) storage = new storage_t; else - storage->data = false; // destruct all other types + storage->destroy(); storage->type = new_type; assert(is_type(new_type)); } @@ -911,7 +911,7 @@ void value_t::in_place_cast(type_t cast_type) if (amt.is_null()) set_balance(balance_t()); else - set_balance(as_amount()); // creates temporary + set_balance(as_amount()); return; case STRING: if (amt.is_null()) diff --git a/src/value.h b/src/value.h index 3a052fb2..5fb78cb4 100644 --- a/src/value.h +++ b/src/value.h @@ -166,19 +166,8 @@ private: */ ~storage_t() { TRACE_DTOR(value_t::storage_t); - DEBUG("value.storage.refcount", "Destroying " << this); assert(refc == 0); - - switch (type) { - case BALANCE: - checked_delete(boost::get<balance_t *>(data)); - break; - case SEQUENCE: - checked_delete(boost::get<sequence_t *>(data)); - break; - default: - break; - } + destroy(); } private: @@ -218,6 +207,21 @@ private: friend inline void intrusive_ptr_release(value_t::storage_t * storage) { storage->release(); } + + void destroy() { + DEBUG("value.storage.refcount", "Destroying " << this); + switch (type) { + case BALANCE: + checked_delete(boost::get<balance_t *>(data)); + break; + case SEQUENCE: + checked_delete(boost::get<sequence_t *>(data)); + break; + default: + break; + } + type = VOID; + } }; /** |