erlang nif中的Protobuf消息和memcpy

erlang nif中的Protobuf消息和memcpy,erlang,protocol-buffers,memcpy,erlang-nif,Erlang,Protocol Buffers,Memcpy,Erlang Nif,我在nif函数(erlang nif)中使用protobuf,需要创建protobuf消息类型的资源。我写了这样的东西: ERL_NIF_TERM create_resource(ErlNifEnv *env, const MyClass &msg) { size_t size = sizeof(MyClass); MyClass *class = (MyClass *)enif_alloc_resource(MY_CLASS, size); memcpy(c

我在nif函数(erlang nif)中使用protobuf,需要创建protobuf消息类型的资源。我写了这样的东西:

ERL_NIF_TERM create_resource(ErlNifEnv *env, const MyClass &msg)
{
    size_t size = sizeof(MyClass);

    MyClass *class = (MyClass *)enif_alloc_resource(MY_CLASS, size);

    memcpy(class, &msg, size);
    // class->CopyFrom(&msg);

    ERL_NIF_TERM term = enif_make_resource(env, class);
    enif_release_resource(class);

    return term;
}
问题是。。这样复制protobuf消息合法吗?在清理过程中,只需使用以下内容释放它:

  delete pointer
?? 似乎一切都在这里,但我不是舒尔,因为复制对象的构造函数没有被调用,可能是静态变量等有一些魔力。。。 也。。我需要在memcpy之后给CopyFrom打电话吗


UPD:MyClass是C++类,不是C< /P> > P> EnIFIAL资源,EnIFIRelaSeEx资源,EnIFEMAJAL资源为您做所有内存管理。通过将资源类型设置为指针,您可以使其变得更简单,在这种情况下,您可以从定义的资源析构函数(调用enif_open_resource_type时传递的函数指针)中调用delete

就使用memcpy所做的工作而言,对于复杂对象来说是不安全的。例如,如果您的一个类成员是指向在其析构函数中销毁的动态分配资源的指针,并且您使用它,那么两个对象现在共享同一资源。当其中一个对象被销毁时(超出范围,请使用delete操作符),另一个对象将保留一个指向已释放内存的指针


这就是为什么如果您有一个复杂的类,就要定义复制和赋值构造函数。我猜CopyFrom实际上应该是您的赋值和复制构造函数。

我的朋友建议我不要将资源从类对象中提取出来,而最好从对象上的指针提取出来。我将尝试这种方法。通过这种方式,我将成为舒尔的一员,可以正确调用构造函数和析构函数。嘿,顺便说一句,我不知道为什么要使用协议缓冲区,但如果您需要erlang兼容性,则始终有piqi: