c++ - 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)
这样的事情可能吗?谢谢,杰克
解决方案
您遇到的问题是,一旦库将对象返回给应用程序,就无法知道应用程序何时完成它,并且删除它是安全的。所以最简单的方法是发明某种协议。在这方面有很多工作,智能指针、引用计数等,但根据我的经验,这些并不像它们最初出现的那样容易实现。
如果您担心内存泄漏,提供删除对象的库函数将允许您跟踪分配的内容与释放的内容,并且您可以记录某种错误消息,但通常只有在卸载库后才会发生这种情况。
如果您不希望在堆上分配对象的性能开销,您可以使用删除函数实现某种缓存机制,其中 create 仅在缓存中没有对象时创建对象。
推荐阅读
- java - SQLServerException:此驱动程序未配置为集成身份验证。ClientConnectionId:ac8ee3bc-e4b0-4cb9-9dcd-f83ce3eab689
- error-handling - 如何处理特定的 CommandInvokeError?[DIScord.py]
- flutter - Flutter/Dart Null 安全迁移
- javascript - 如何在 onSort.subscribe 事件期间获取光滑网格列的容器 ID
- volttron - volttron 对 rpc 调用 get_point 进行故障排除
- reactjs - 有条件的动画组件是 janky
- github - 发布 github 包时主版本无效
- flutter - Flutter:如何处理 SliverPersistentHeader 中的 Renderflex 溢出
- list - SFMC - 如何查询 LIST?
- unix - 单行生成的 CAT EOF 运行失败