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
This commit is contained in:
parent
b1d09f1a51
commit
352f0636ef
@ -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()) {
|
||||
|
Loading…
Reference in New Issue
Block a user