将智能指针发送到protobaf。记忆问题

时间:2016-12-06 12:07:05

标签: c++ protocol-buffers smart-pointers

我使用protobuf作为网络通信的数据格式。

在我的数据模型中有WrapperMessage,包装器包含子消息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;
}

1 个答案:

答案 0 :(得分:2)

在上面的代码中,您将message对象的所有权转移到shared_ptr和protobuf wm对象。这是不正确的。当达到范围结束时,它们都会删除此对象,第二次删除会导致错误。最简单的解决方法是直接使用message指针而不创建shared_ptr