diff --git a/src/fs/io/AutoGunzipReader.cxx b/src/fs/io/AutoGunzipReader.cxx
index 158df7b52..38ac6a320 100644
--- a/src/fs/io/AutoGunzipReader.cxx
+++ b/src/fs/io/AutoGunzipReader.cxx
@@ -20,10 +20,10 @@
 #include "AutoGunzipReader.hxx"
 #include "GunzipReader.hxx"
 
-AutoGunzipReader::~AutoGunzipReader() noexcept
-{
-	delete gunzip;
-}
+AutoGunzipReader::AutoGunzipReader(Reader &_next) noexcept
+	:peek(_next) {}
+
+AutoGunzipReader::~AutoGunzipReader() noexcept = default;
 
 gcc_pure
 static bool
@@ -43,7 +43,7 @@ AutoGunzipReader::Detect()
 	}
 
 	if (IsGzip(data))
-		next = gunzip = new GunzipReader(peek);
+		next = (gunzip = std::make_unique<GunzipReader>(peek)).get();
 	else
 		next = &peek;
 }
diff --git a/src/fs/io/AutoGunzipReader.hxx b/src/fs/io/AutoGunzipReader.hxx
index 73a4043af..85025437e 100644
--- a/src/fs/io/AutoGunzipReader.hxx
+++ b/src/fs/io/AutoGunzipReader.hxx
@@ -21,7 +21,8 @@
 #define MPD_AUTO_GUNZIP_READER_HXX
 
 #include "PeekReader.hxx"
-#include "util/Compiler.h"
+
+#include <memory>
 
 class GunzipReader;
 
@@ -32,11 +33,10 @@ class GunzipReader;
 class AutoGunzipReader final : public Reader {
 	Reader *next = nullptr;
 	PeekReader peek;
-	GunzipReader *gunzip = nullptr;
+	std::unique_ptr<GunzipReader> gunzip;
 
 public:
-	explicit AutoGunzipReader(Reader &_next) noexcept
-		:peek(_next) {}
+	explicit AutoGunzipReader(Reader &_next) noexcept;
 	~AutoGunzipReader() noexcept;
 
 	/* virtual methods from class Reader */