diff --git a/include/sta/ArrayTable.hh b/include/sta/ArrayTable.hh index 1ef5f70d..13aac268 100644 --- a/include/sta/ArrayTable.hh +++ b/include/sta/ArrayTable.hh @@ -59,6 +59,7 @@ private: size_t blocks_size_; size_t blocks_capacity_; ArrayBlock* *blocks_; + ArrayBlock* *prev_blocks_; static constexpr ObjectId idx_mask_ = block_size - 1; }; @@ -68,6 +69,7 @@ ArrayTable::ArrayTable() : blocks_size_(0), blocks_capacity_(1024), blocks_(new ArrayBlock*[blocks_capacity_]), + prev_blocks_(nullptr), free_block_idx_(block_idx_null), free_idx_(object_idx_null) { @@ -78,6 +80,7 @@ ArrayTable::~ArrayTable() { deleteBlocks(); delete [] blocks_; + delete [] prev_blocks_; } template @@ -130,10 +133,12 @@ ArrayTable::pushBlock(ArrayBlock *block) size_t new_capacity = blocks_capacity_ * 1.5; ArrayBlock** new_blocks = new ArrayBlock*[new_capacity]; memcpy(new_blocks, blocks_, blocks_capacity_ * sizeof(ArrayBlock*)); - ArrayBlock** old_blocks = blocks_; + if (prev_blocks_) + delete [] prev_blocks_; + // Preserve block array for other threads to reference. + prev_blocks_ = blocks_; blocks_ = new_blocks; blocks_capacity_ = new_capacity; - delete [] old_blocks; } }