diff --git a/include/grpc++/alarm.h b/include/grpc++/alarm.h
index f0ab546cb29e5a55b5a3c16052d3ea6315da7062..9979c34e4f13190ea70333af35a80ad5aec2f6e3 100644
--- a/include/grpc++/alarm.h
+++ b/include/grpc++/alarm.h
@@ -36,6 +36,7 @@
 #ifndef GRPCXX_ALARM_H
 #define GRPCXX_ALARM_H
 
+#include <grpc++/impl/codegen/completion_queue_tag.h>
 #include <grpc++/impl/codegen/grpc_library.h>
 #include <grpc++/impl/codegen/time.h>
 
@@ -63,6 +64,19 @@ class Alarm : private GrpcLibrary {
   void Cancel();
 
  private:
+  class AlarmEntry : public CompletionQueueTag {
+   public:
+    AlarmEntry(void* tag) : tag_(tag) {}
+    bool FinalizeResult(void** tag, bool* status) GRPC_OVERRIDE {
+      *tag = tag_;
+      return true;
+    }
+
+   private:
+    void* tag_;
+  };
+
+  AlarmEntry tag_;
   grpc_alarm* const alarm_;  // owned
 };
 
diff --git a/src/cpp/common/alarm.cc b/src/cpp/common/alarm.cc
index aca15dc5eb5791a8786cddd46742d599b29762f2..a2896887682aeea4e258ffe5a4dbcfca01b64052 100644
--- a/src/cpp/common/alarm.cc
+++ b/src/cpp/common/alarm.cc
@@ -32,29 +32,15 @@
 
 #include <grpc++/alarm.h>
 #include <grpc++/completion_queue.h>
-#include <grpc++/impl/codegen/completion_queue_tag.h>
 #include <grpc++/impl/grpc_library.h>
 #include <grpc/grpc.h>
 
 namespace grpc {
 
-class AlarmEntry : public CompletionQueueTag {
- public:
-  AlarmEntry(void* tag) : tag_(tag) {}
-  bool FinalizeResult(void** tag, bool* status) GRPC_OVERRIDE {
-    *tag = tag_;
-    delete this;
-    return true;
-  }
-
- private:
-  void* tag_;
-};
-
 static internal::GrpcLibraryInitializer g_gli_initializer;
 Alarm::Alarm(CompletionQueue* cq, gpr_timespec deadline, void* tag)
-    : alarm_(grpc_alarm_create(cq->cq(), deadline,
-                               static_cast<void*>(new AlarmEntry(tag)))) {
+    : tag_(tag),
+      alarm_(grpc_alarm_create(cq->cq(), deadline, static_cast<void*>(&tag_))) {
   g_gli_initializer.summon();
 }