diff --git a/rejistry++/src/RegistryHive.h b/rejistry++/src/RegistryHive.h
index c5abb29cf189c597bdac852291f754e0149bb14c..786c65637df69ded9873e9a277e835a33bd77345 100644
--- a/rejistry++/src/RegistryHive.h
+++ b/rejistry++/src/RegistryHive.h
@@ -48,6 +48,10 @@ namespace Rejistry {
          */
         virtual REGFHeader * getHeader() const = 0;
 
+        /**
+         * Virtual destructor to prevent memory leak
+         */
+        virtual ~RegistryHive() {}
     };
 };
 
diff --git a/rejistry++/src/RegistryHiveBuffer.cpp b/rejistry++/src/RegistryHiveBuffer.cpp
index d7233c7b7897275615763c8c76e506606ad8440b..adb940c3ef8e89bc1529d7142347f3b2d36ccb59 100644
--- a/rejistry++/src/RegistryHiveBuffer.cpp
+++ b/rejistry++/src/RegistryHiveBuffer.cpp
@@ -47,7 +47,10 @@ namespace Rejistry {
     }
 
     RegistryKey * RegistryHiveBuffer::getRoot() const {
-        return new RegistryKey(getHeader()->getRootNKRecord());
+        REGFHeader *header = getHeader();
+        Rejistry::NKRecord *nkRecord = header->getRootNKRecord();
+        delete header;
+        return new RegistryKey(nkRecord);
     }
 
     REGFHeader * RegistryHiveBuffer::getHeader() const {
diff --git a/rejistry++/src/RegistryKey.cpp b/rejistry++/src/RegistryKey.cpp
index dd6b5ae068595b583fdd3365effd830daaa845e8..f342962ee4300bbbf9bb047bf210d0672667519e 100644
--- a/rejistry++/src/RegistryKey.cpp
+++ b/rejistry++/src/RegistryKey.cpp
@@ -74,19 +74,34 @@ namespace Rejistry {
      */
     RegistryKey::RegistryKeyPtrList RegistryKey::getSubkeyList() const {
         std::vector<RegistryKey *> subkeys;
-        NKRecord::NKRecordPtrList nkRecordList = _nk->getSubkeyList()->getSubkeys();
+        SubkeyListRecord::SubkeyListRecordPtr subkeyListRecordPtr = _nk->getSubkeyList();
+        NKRecord::NKRecordPtrList nkRecordList = subkeyListRecordPtr->getSubkeys();
         NKRecord::NKRecordPtrList::iterator it;
         for (it = nkRecordList.begin(); it != nkRecordList.end(); ++it) {
             subkeys.push_back(new RegistryKey(*it));
         }
+        delete subkeyListRecordPtr;
         return subkeys;
     }
 
+
+    size_t RegistryKey::getSubkeyListSize() const {
+        std::vector<RegistryKey *> subkeys;
+        SubkeyListRecord::SubkeyListRecordPtr subkeyListRecordPtr = _nk->getSubkeyList();
+        NKRecord::NKRecordPtrList nkRecordList = subkeyListRecordPtr->getSubkeys();
+        delete subkeyListRecordPtr;
+        return nkRecordList.size();
+    }
+
+
     /**
      * Caller is responsible for freeing returned key
      */
     RegistryKey::RegistryKeyPtr RegistryKey::getSubkey(const std::wstring& name) const {
-        return new RegistryKey(_nk->getSubkeyList()->getSubkey(name));
+        SubkeyListRecord::SubkeyListRecordPtr subkeyListRecordPtr = _nk->getSubkeyList();
+        Rejistry::NKRecord *nkRecord = subkeyListRecordPtr->getSubkey(name);
+        delete subkeyListRecordPtr;
+        return new RegistryKey(nkRecord);
     }
 
     /**
@@ -102,10 +117,21 @@ namespace Rejistry {
         return values;
     }
 
+
+    size_t RegistryKey::getValueListSize() const {
+        Rejistry::ValueListRecord *valueListRecord = _nk->getValueList();
+        size_t size = valueListRecord->getValuesSize();
+        delete valueListRecord;
+        return size;
+    }
+
     /**
      * Caller is responsible for freeing returned value
      */
     RegistryValue::RegistryValuePtr RegistryKey::getValue(const std::wstring& name) const {
-        return new RegistryValue(_nk->getValueList()->getValue(name));
+        Rejistry::ValueListRecord *valueListRecord = _nk->getValueList();
+        Rejistry::VKRecord *vkRecord = valueListRecord->getValue(name);
+        delete valueListRecord;
+        return new RegistryValue(vkRecord);
     }
 };
diff --git a/rejistry++/src/RegistryKey.h b/rejistry++/src/RegistryKey.h
index 9d7f0dd8060e10a4cf8ac540210116659c481d9c..d14ef59f481787d215996da8910233a9bc5eddf4 100644
--- a/rejistry++/src/RegistryKey.h
+++ b/rejistry++/src/RegistryKey.h
@@ -73,6 +73,13 @@ namespace Rejistry {
          */
         RegistryKeyPtrList getSubkeyList() const;
 
+        /**
+        * Get number of subkeys for the current registry key.
+        * @returns number of subkeys.
+        * @throws RegistryParseException on error.
+        */
+        size_t getSubkeyListSize() const;
+
         /**
          * Get the subkey with the given name.
          * @param name ASCII name of the subkey of retrieve.
@@ -88,6 +95,13 @@ namespace Rejistry {
          */
         RegistryValue::RegistryValuePtrList getValueList() const;
 
+        /**
+        * Get number of values for the current key.
+        * @returns Number of values.
+        * @throws RegistryParseException on error.
+        */
+        size_t getValueListSize() const;
+
         /**
          * Get the value for the given name.
          * @param name ASCII name of the value to retrieve.
diff --git a/rejistry++/src/ValueData.h b/rejistry++/src/ValueData.h
index 619918b2a52038c50848f4c07e58b75bf171d2c4..f29f7fd6b418f86a02f119cf335c85b8decdaefc 100644
--- a/rejistry++/src/ValueData.h
+++ b/rejistry++/src/ValueData.h
@@ -68,6 +68,11 @@ namespace Rejistry {
             _type = type;
         }
         
+        ~ValueData() {
+            if (_buf)
+                delete _buf;
+        }
+
         VALUE_TYPES getValueType() const { return _type; };
 
         /**
diff --git a/rejistry++/src/ValueListRecord.h b/rejistry++/src/ValueListRecord.h
index 44d8b1a9cb4aaa7952414a265d4c459134249209..25f144733cb696abacc0287a621679b697c1e872 100644
--- a/rejistry++/src/ValueListRecord.h
+++ b/rejistry++/src/ValueListRecord.h
@@ -61,6 +61,11 @@ namespace Rejistry {
          */
         VKRecord::VKRecordPtr getValue(const std::wstring& name) const;
 
+        /**
+        * @returns The ValueListRecord size
+        */
+        size_t getValuesSize() const { return _numValues; }
+
     private:
         static const uint16_t VALUE_LIST_OFFSET = 0x00;