refactor: reduce unnecessary memory malloc (#432)

diff --git a/src/MQClientAPIImpl.cpp b/src/MQClientAPIImpl.cpp
index 47494fa..19cf3f5 100644
--- a/src/MQClientAPIImpl.cpp
+++ b/src/MQClientAPIImpl.cpp
@@ -229,7 +229,7 @@
 SendResult MQClientAPIImpl::sendMessage(const string& addr,
                                         const string& brokerName,
                                         const MQMessage& msg,
-                                        SendMessageRequestHeader* pRequestHeader,
+                                        const SendMessageRequestHeader& requestHeader,
                                         int timeoutMillis,
                                         int maxRetrySendTimes,
                                         int communicationMode,
@@ -237,9 +237,8 @@
                                         const SessionCredentials& sessionCredentials) {
   // RemotingCommand request(SEND_MESSAGE, pRequestHeader);
   // Using MQ V2 Protocol to end messages.
-  SendMessageRequestHeaderV2* pRequestHeaderV2 = new SendMessageRequestHeaderV2(*pRequestHeader);
+  SendMessageRequestHeaderV2* pRequestHeaderV2 = new SendMessageRequestHeaderV2(requestHeader);
   RemotingCommand request(SEND_MESSAGE_V2, pRequestHeaderV2);
-  delete pRequestHeader;  // delete to avoid memory leak.
   string body = msg.getBody();
   request.SetBody(body.c_str(), body.length());
   request.setMsgBody(body);
diff --git a/src/MQClientAPIImpl.h b/src/MQClientAPIImpl.h
index b8bd883..bf8c892 100644
--- a/src/MQClientAPIImpl.h
+++ b/src/MQClientAPIImpl.h
@@ -72,7 +72,7 @@
   virtual SendResult sendMessage(const string& addr,
                                  const string& brokerName,
                                  const MQMessage& msg,
-                                 SendMessageRequestHeader* pRequestHeader,
+                                 const SendMessageRequestHeader& requestHeader,
                                  int timeoutMillis,
                                  int maxRetrySendTimes,
                                  int communicationMode,
diff --git a/src/producer/DefaultMQProducerImpl.cpp b/src/producer/DefaultMQProducerImpl.cpp
index 87d44f4..0e7c784 100644
--- a/src/producer/DefaultMQProducerImpl.cpp
+++ b/src/producer/DefaultMQProducerImpl.cpp
@@ -481,18 +481,18 @@
         }
         executeSendMessageHookBefore(pSendMesgContext.get());
       }
-      SendMessageRequestHeader* requestHeader = new SendMessageRequestHeader();
-      requestHeader->producerGroup = getGroupName();
-      requestHeader->topic = (msg.getTopic());
-      requestHeader->defaultTopic = DEFAULT_TOPIC;
-      requestHeader->defaultTopicQueueNums = 4;
-      requestHeader->queueId = (mq.getQueueId());
-      requestHeader->sysFlag = (msg.getSysFlag());
-      requestHeader->bornTimestamp = UtilAll::currentTimeMillis();
-      requestHeader->flag = (msg.getFlag());
-      requestHeader->consumeRetryTimes = 16;
-      requestHeader->batch = isBatchMsg;
-      requestHeader->properties = (MQDecoder::messageProperties2String(msg.getProperties()));
+      SendMessageRequestHeader requestHeader;
+      requestHeader.producerGroup = getGroupName();
+      requestHeader.topic = (msg.getTopic());
+      requestHeader.defaultTopic = DEFAULT_TOPIC;
+      requestHeader.defaultTopicQueueNums = 4;
+      requestHeader.queueId = (mq.getQueueId());
+      requestHeader.sysFlag = (msg.getSysFlag());
+      requestHeader.bornTimestamp = UtilAll::currentTimeMillis();
+      requestHeader.flag = (msg.getFlag());
+      requestHeader.consumeRetryTimes = 16;
+      requestHeader.batch = isBatchMsg;
+      requestHeader.properties = (MQDecoder::messageProperties2String(msg.getProperties()));
 
       SendResult sendResult = getFactory()->getMQClientAPIImpl()->sendMessage(
           brokerAddr, mq.getBrokerName(), msg, requestHeader, getSendMsgTimeout(), getRetryTimes4Async(),
diff --git a/src/protocol/CommandHeader.h b/src/protocol/CommandHeader.h
index 7ebf54b..9ce4400 100644
--- a/src/protocol/CommandHeader.h
+++ b/src/protocol/CommandHeader.h
@@ -175,7 +175,7 @@
 //<!************************************************************************
 class SendMessageRequestHeaderV2 : public CommandHeader {
  public:
-  SendMessageRequestHeaderV2(SendMessageRequestHeader v1) {
+  explicit SendMessageRequestHeaderV2(const SendMessageRequestHeader& v1) {
     a = v1.producerGroup;
     b = v1.topic;
     c = v1.defaultTopic;