2016-12-06 6 views
1

Я использую protobuf в качестве формата данных для сетевых коммуникаций.Отправка умного указателя на протобаф. Проблема с памятью

В моей модели данных есть WrapperMessage, wrapper, которая включает в себя вспомогательное сообщение RegistrationRequest и InputChecking.

Где-то в программе я создаю один тип сообщения (RegistrationRequest/InputChecking), затем передавая его на шаблоны функций, чтобы включить его в WrapperMessage, затем сериализуем и отправляем.

Но что-то не так с моим указателем? malloc/new/все, что обнаруживает кучу коррупции ?? Я не понимаю, почему он не хочет принимать 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.