2016-12-06 45 views
1

我使用protobuf作爲網絡通信的數據格式。發送智能指針給protobaf。內存問題

在我的數據模型中有WrapperMessage,其中包含子消息RegistrationRequest和InputChecking的包裝。

程序中的某處我創建了一種類型的消息(RegistrationRequest/InputChecking),然後將它傳遞給函數模板以將其包含在WrapperMessage中,然後序列化併發送。

但是我的指針有問題嗎? malloc /新/任何檢測堆腐敗?我不明白的是,爲什麼他不希望採取mes.get(),並在運行時將..

錯誤:嚴重錯誤檢測c0000374

我的測試程序的所有代碼:

#include "ProtobufDataModels.pb.h" 
#include <string> 
#include <iostream> 
#include <memory> 

template <class T> 
static void SendProto(T * message); 

template <class T> 
void SendProto(T * message) 
{ 
    WrapperMessage wm; 

    if (std::is_same<T, InputChecking>::value) 
    { 
     std::shared_ptr<InputChecking> mes(message); 

     std::string msg; 
     message->SerializeToString(&msg); 
     std::cout << msg << std::endl; // all ok 

     // set inputChecking mes. to wrapperMessage 
     wm.set_allocated_mes_inputchecking(mes.get()); // crash here 

    } 
    else if (std::is_same<T, RegistrationRequest>::value) 
    { 
    } 

} 

int main() 
{ 
    InputChecking * inputChecking = new InputChecking(); 
    inputChecking->set_login("Jack"); 

    SendProto(inputChecking); 

    std::cin.get(); 

    return 0; 
} 

回答

2

在上面的代碼中,您將message對象的所有權轉移給shared_ptr和protobuf wm對象。這是不正確的。他們兩個都在範圍結束時刪除這個對象,第二次刪除導致錯誤。解決這個問題的最簡單方法是直接使用message指針,而不用創建shared_ptr