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 的内存/堆管理
基础教程推荐
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07