0

我在 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 ?

更新:MyClass 是 C++ 类而不是 C

4

1 回答 1

1

enif_alloc_resource、enif_release_resource 和 enif_make_resource 为您完成所有内存管理。您可以通过将资源类型设置为指针来使其更容易一些,在这种情况下,您可以从定义的资源析构函数(调用 enif_open_resource_type 时传递的函数指针)中调用 delete。

至于你用 memcpy 做什么,它对于复杂的对象是不安全的。例如,如果您的类成员之一是指向动态分配资源的指针,该资源在其析构函数中销毁,并且您对其进行 memcpy,则两个对象现在共享同一资源。当其中一个对象被销毁(超出范围,删除运算符)时,另一个对象会留下一个指向已释放内存的指针。

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

于 2012-12-26T07:33:08.923 回答