From 352f0636ef555cc8d8761500461da8d155cafad4 Mon Sep 17 00:00:00 2001 From: Mayank Agarwal Date: Mon, 2 Sep 2013 15:17:03 -0700 Subject: [PATCH] Fix memory leak in table.cc Summary: In InternalGet, BlockReader returns an Iterator which is legitimately freed at the end of the 'else' scope. BUT there is a break statement in between and must be freed there too! The best solution would be to move to unique_ptr and let it handle. Changed it to a unique_ptr. Test Plan: valgrind ./db_test;make all check Reviewers: dhruba, haobo Reviewed By: dhruba CC: leveldb Differential Revision: https://reviews.facebook.net/D12681 --- table/table.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/table/table.cc b/table/table.cc index f2b80cbbc3..d2d198fb81 100644 --- a/table/table.cc +++ b/table/table.cc @@ -421,8 +421,8 @@ Status Table::InternalGet(const ReadOptions& options, const Slice& k, break; } else { bool didIO = false; - Iterator* block_iter = BlockReader(this, options, iiter->value(), - &didIO); + std::unique_ptr block_iter( + BlockReader(this, options, iiter->value(), &didIO)); if (options.read_tier && block_iter->status().IsIncomplete()) { // couldn't get block from block_cache @@ -440,7 +440,6 @@ Status Table::InternalGet(const ReadOptions& options, const Slice& k, } } s = block_iter->status(); - delete block_iter; } } if (s.ok()) {