diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc
index 44c8a768d2c0d0ff353a7d1e96c969079c09dc8a..f72b8a30a64313b533581792e6d52ca61dacfad1 100644
--- a/src/cpp/server/server.cc
+++ b/src/cpp/server/server.cc
@@ -36,6 +36,7 @@
 
 #include <grpc/grpc.h>
 #include <grpc/grpc_security.h>
+#include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc++/completion_queue.h>
 #include <grpc++/generic_service.h>
@@ -355,8 +356,11 @@ class Server::AsyncRequest GRPC_FINAL : public CompletionQueueTag {
                 array_.metadata[i].value + array_.metadata[i].value_length)));
       }
       if (generic_ctx_) {
+        // TODO(yangg) remove the copy here.
         generic_ctx_->method_ = call_details_.method;
         generic_ctx_->host_ = call_details_.host;
+        gpr_free(call_details_.method);
+        gpr_free(call_details_.host);
       }
     }
     ctx->call_ = call_;