The lifecycle rules for Env are frustrating and undocumented. Notably,
Env::Default() should *not* be freed, but any Env instances we created
should be.
Explicitly instruct EnvMirror whether to clean up child Env instances.
Default to false so that we do not affect existing callers.
Signed-off-by: Sage Weil <sage@redhat.com>
class EnvMirror : public EnvWrapper {
Env* a_, *b_;
+ bool free_a_, free_b_;
public:
- EnvMirror(Env* a, Env* b) : EnvWrapper(a), a_(a), b_(b) {}
+ EnvMirror(Env* a, Env* b, bool free_a=false, bool free_b=false)
+ : EnvWrapper(a),
+ a_(a),
+ b_(b),
+ free_a_(free_a),
+ free_b_(free_b) {}
+ ~EnvMirror() {
+ if (free_a_)
+ delete a_;
+ if (free_b_)
+ delete b_;
+ }
Status NewSequentialFile(const std::string& f, unique_ptr<SequentialFile>* r,
const EnvOptions& options) override;