Browse Source

putil: fix copy constructor of SimpleHashMap

rdb 8 years ago
parent
commit
7ea16fd772
1 changed files with 13 additions and 2 deletions
  1. 13 2
      panda/src/putil/simpleHashMap.I

+ 13 - 2
panda/src/putil/simpleHashMap.I

@@ -41,7 +41,13 @@ SimpleHashMap(const SimpleHashMap &copy) :
 
 
   _deleted_chain = memory_hook->get_deleted_chain(alloc_size);
   _deleted_chain = memory_hook->get_deleted_chain(alloc_size);
   _table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none());
   _table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none());
-  memcpy(_table, copy._table, alloc_size);
+
+  for (size_t i = 0; i < _num_entries; ++i) {
+    new(&_table[i]) TableEntry(copy._table[i]);
+  }
+
+  // Copy the index array.
+  memcpy(get_index_array(), copy.get_index_array(), _table_size * sizeof(int) * sparsity);
 }
 }
 
 
 /**
 /**
@@ -88,7 +94,12 @@ operator = (const SimpleHashMap<Key, Value, Compare> &copy) {
 
 
     _deleted_chain = memory_hook->get_deleted_chain(alloc_size);
     _deleted_chain = memory_hook->get_deleted_chain(alloc_size);
     _table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none());
     _table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none());
-    memcpy(_table, copy._table, alloc_size);
+    for (size_t i = 0; i < _num_entries; ++i) {
+      new(&_table[i]) TableEntry(copy._table[i]);
+    }
+
+    // Copy the index array.
+    memcpy(get_index_array(), copy.get_index_array(), _table_size * sizeof(int) * sparsity);
   }
   }
   return *this;
   return *this;
 }
 }