我在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
答案 0 :(得分:1)
enif_alloc_resource,enif_release_resource和enif_make_resource为您完成所有内存管理。通过使资源类型成为指针,可以使其更容易一些,在这种情况下,您可以从定义的资源析构函数(调用enif_open_resource_type时传递的函数指针)调用delete。
就你在使用memcpy做的事情而言,它对于复杂的对象来说并不安全。例如,如果您的一个类成员是指向它在析构函数中销毁的动态分配资源的指针,并且您记忆它,则两个对象现在共享同一个资源。当其中一个对象被销毁(超出范围,删除操作符)时,另一个对象留下一个指向释放内存的指针。
如果您有复杂的类,这就是定义复制和赋值构造函数的原因。我猜测CopyFrom实际上应该是你的赋值和复制构造函数。