将智能指针发送到Protobaf.内存问题



i使用ProtoBuf作为网络通信的数据格式。

在我的数据模型中,包含包装器包装器,其中包括子消息registrationRequest和Inputchecking。

程序中的某个地方我创建一种类型的消息(registrationRequest/InputChecking),然后将其传递到功能模板上以将其包含在包装中,然后序列化并发送。

但是我的指针出了点问题吗?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;
}

在上面的代码中,您将message对象的所有权转移到shared_ptr和Protobuf wm对象。这是不正确的。当达到范围的末端时,他们俩都删除了此对象,第二个删除会导致错误。修复它的最简单方法是直接使用message指针,而无需创建shared_ptr

相关内容

  • 没有找到相关文章

最新更新