提交 352f0636 编写于 作者: M Mayank Agarwal

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
上级 b1d09f1a
......@@ -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<Iterator> 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()) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册