diff --git a/src/core/lib/support/memory.h b/src/core/lib/support/memory.h index 3e00fb2011d..bd56ca39394 100644 --- a/src/core/lib/support/memory.h +++ b/src/core/lib/support/memory.h @@ -61,8 +61,8 @@ class DefaultDelete { void operator()(T* p) { Delete(p); } }; -template <typename T> -using UniquePtr = std::unique_ptr<T, DefaultDelete<T>>; +template <typename T, typename Deleter = DefaultDelete<T>> +using UniquePtr = std::unique_ptr<T, Deleter>; template <typename T, typename... Args> inline UniquePtr<T> MakeUnique(Args&&... args) { diff --git a/test/core/support/memory_test.cc b/test/core/support/memory_test.cc index 9e20e48b0cc..8db316a4238 100644 --- a/test/core/support/memory_test.cc +++ b/test/core/support/memory_test.cc @@ -66,6 +66,19 @@ TEST(MemoryTest, MakeUniqueWithArgTest) { EXPECT_EQ(42, *i); } +TEST(MemoryTest, UniquePtrWithCustomDeleter) { + int n = 0; + class IncrementingDeleter { + public: + void operator()(int* p) { ++*p; } + }; + { + UniquePtr<int, IncrementingDeleter> p(&n); + EXPECT_EQ(0, n); + } + EXPECT_EQ(1, n); +} + } // namespace testing } // namespace grpc_core