首页 > 解决方案 > C++ 包装库:在堆栈上分配 C 中的 C++ 对象

问题描述

我在 C++ 中创建了一个库,公开了一些 C++ 对象。由于该库应该可以在 C++ 以外的其他语言中使用(C 以及通过 FFI、Java 和 Python),因此我创建了一个小型包装库,如下所示:

    typedef void* MyObject;    
    MyObject create_Object(); // implemented in C++, returns a C++ Object as void*, allocated on the heap
    doSomething(MyObject);
    deleteObject(MyObject);

到目前为止,一切都很好。这一切都很标准,但我不喜欢在堆上分配对象的开销,此外,我想消除不调用免费方法 deleteObject 可能出现的错误。所以,我想到了这样的事情:

    // somehow tell C that MyObject consists of X bytes
    MyObject my; // I can allocate this now on the stack, since C knows its size
    create_object(&my); // allocates it
    doSometing(&my);
    // no need to free, so destructor is not called (there is no real need to call it anymway)

这样的事情可能吗?谢谢,杰克

标签: c++c

解决方案


您遇到的问题是,一旦库将对象返回给应用程序,就无法知道应用程序何时完成它,并且删除它是安全的。所以最简单的方法是发明某种协议。在这方面有很多工作,智能指针、引用计数等,但根据我的经验,这些并不像它们最初出现的那样容易实现。

如果您担心内存泄漏,提供删除对象的库函数将允许您跟踪分配的内容与释放的内容,并且您可以记录某种错误消息,但通常只有在卸载库后才会发生这种情况。

如果您不希望在堆上分配对象的性能开销,您可以使用删除函数实现某种缓存机制,其中 create 仅在缓存中没有对象时创建对象。


推荐阅读