Memory / heap management across DLLs(跨 DLL 的内存/堆管理)
问题描述
虽然这看起来是一个很常见的问题,但我并没有收获太多信息:如何在 DLL 边界之间创建一个关于内存分配的安全接口?
Although it seems to be a very common issue, I did not harvest much information: How can I create a safe interface between DLL boundaries regarding memory alloction?
众所周知
// in DLL a
DLLEXPORT MyObject* getObject() { return new MyObject(); }
// in DLL b
MyObject *o = getObject();
delete o;
肯定会导致崩溃.但由于像上面这样的交互 - 正如我敢说的 - 并不少见,因此必须有一种方法来确保安全的内存分配.
might certainly lead to crashes. But since interactions like the one above are - as I dare say - not uncommon, there has to be a way to ensure safe memory allocation.
当然可以提供
// in DLL a
DLLEXPORT void deleteObject(MyObject* o) { delete o; }
但也许有更好的方法(例如 smart_ptr?).我还阅读了有关在处理 STL 容器时使用自定义分配器的信息.
but maybe there are better ways (e.g. smart_ptr?). I read about using custom allocators when dealing with STL containers as well.
因此,我的查询更多是关于关于与该主题相关的文章和/或文献的一般指示.是否有需要注意的特殊谬误(异常处理?)?这个问题是否仅限于 DLL 或 UNIX 共享对象也受到影响"?
So my inquiry is more about general pointers to articles and/or literature dealing with this topic. Are there special fallacies to look out for (exception handling?) and is this problem limited to only DLLs or are UNIX shared objects "inflicted" too?
推荐答案
正如您所建议的,您可以使用 boost::shared_ptr 来处理这个问题.在构造函数中,您可以传递一个自定义清理函数,它可以是创建指针的 dll 的 deleteObject-Method.示例:
As you suggested, you can use a boost::shared_ptr to handle that problem. In the constructor you can pass a custom cleanup function, which could be the deleteObject-Method of the dll that created the pointer. Example:
boost::shared_ptr< MyObject > Instance( getObject( ), deleteObject );
如果你的 dll 不需要 C 接口,你可以让 getObject
返回一个 shared_ptr.
If you do not need a C-Interface for your dll, you can have getObject
return a shared_ptr.
这篇关于跨 DLL 的内存/堆管理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:跨 DLL 的内存/堆管理


基础教程推荐
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 常量变量在标题中不起作用 2021-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01