析构函数在protobuf对象上被调用

时间:2015-07-14 08:16:31

标签: c++ protocol-buffers

我已经实现了两个简单的protobuf消息

package TestNamespace;
message Object1 {
  int32 age = 1;
  int32 speed = 2;
}

message Object2 {
  Object1 obj = 1;
  int32 page_number = 2;
}

然后我有两个protobuf对象的包装类。 在Object2Wrapper内部,当我调用ToProtobuf返回析构函数时,由于某种原因我无法理解它在obj1上被调用。

class Object1Wrapper
    {
    public:
        int32_t Age{};
        int32_t Speed{};

        void ToProtobuf(TestNamespace::Object1 obj1)
        {
            obj1.set_age(Age);
            obj1.set_speed(Speed);
            //After this line the ~destructor is called on obj1
        }
};

class Object2Wrapper{

    public:
        Object1Wrapper obj1{};
        int32_t page_number{};

        void ToProtobuf(TestNamespace::Object2 obj2Param)
        {
            TestNamespace::Object1 * obj1Proto = obj2Param.mutable_obj();
            obj1::ToProtobuf(*obj1Proto);
            // Do stuff.... but obj1Proto is empty
        }
};

1 个答案:

答案 0 :(得分:2)

原因是您按值传递对象obj1。创建参数的副本,并在函数返回时销毁此副本。\

我猜你真正想做的是通过引用传递对象。即

void ToProtobuf(TestNamespace::Object1& obj1)
    {
        obj1.set_age(Age);
        obj1.set_speed(Speed);
        //After this line the ~destructor is called on obj1
    }

只有在通过引用传递时,才能更改函数内的对象。正如您现在所做的那样,对函数内obj1的任何更改都不会对传递给函数的参数产生任何影响。