diff --git a/io/io/inc/ROOT/TBufferMerger.hxx b/io/io/inc/ROOT/TBufferMerger.hxx
index 39966f58dc77d356e6b4143f473a05f1a359d638..a5360991c35bc3c629056d3c256260d1bbb8eec8 100644
--- a/io/io/inc/ROOT/TBufferMerger.hxx
+++ b/io/io/inc/ROOT/TBufferMerger.hxx
@@ -104,7 +104,7 @@ private:
    /** TBufferMerger has no copy operator */
    TBufferMerger &operator=(const TBufferMerger &);
 
-   void Init(TFile*);
+   void Init(std::unique_ptr<TFile>);
 
    void Merge();
    void Push(TBufferFile *buffer);
diff --git a/io/io/src/TBufferMerger.cxx b/io/io/src/TBufferMerger.cxx
index e671391e8b78a0e2a4b4b26ed1ee28745750fa35..db9f87fd8c037bd3a0ec359313b2ac7189e3c18e 100644
--- a/io/io/src/TBufferMerger.cxx
+++ b/io/io/src/TBufferMerger.cxx
@@ -16,6 +16,8 @@
 #include "TROOT.h"
 #include "TVirtualMutex.h"
 
+#include <utility>
+
 namespace ROOT {
 namespace Experimental {
 
@@ -24,20 +26,20 @@ TBufferMerger::TBufferMerger(const char *name, Option_t *option, Int_t compress)
    // We cannot chain constructors or use in-place initialization here because
    // instantiating a TBufferMerger should not alter gDirectory's state.
    TDirectory::TContext ctxt;
-   Init(TFile::Open(name, option, /* title */ name, compress));
+   Init(std::unique_ptr<TFile>(TFile::Open(name, option, /* title */ name, compress)));
 }
 
 TBufferMerger::TBufferMerger(std::unique_ptr<TFile> output)
 {
-   Init(output.release());
+   Init(std::move(output));
 }
 
-void TBufferMerger::Init(TFile *output)
+void TBufferMerger::Init(std::unique_ptr<TFile> output)
 {
    if (!output || !output->IsWritable() || output->IsZombie())
       Error("TBufferMerger", "cannot write to output file");
 
-   fMerger.OutputFile(std::unique_ptr<TFile>(output));
+   fMerger.OutputFile(std::move(output));
    fMergingThread.reset(new std::thread([&]() { this->WriteOutputFile(); }));
 }