跨DLL的内存/堆管理 [英] Memory / heap management across DLLs

查看:114
本文介绍了跨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 a>来处理这个问题。在构造函数中,你可以传递一个自定义的清理函数,它可以是创建指针的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 );

如果你不需要一个C接口为你的dll,你可以有 getObject 返回一个shared_ptr。

If you do not need a C-Interface for your dll, you can have getObject return a shared_ptr.

这篇关于跨DLL的内存/堆管理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆