这是有效制定一个DLL在C++返回提高共用的指针,并使用它们作为参数?

因此,它是确定出口的功能这样?

1.) boost::shared_ptr<Connection> startConnection();
2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);

在特别:并参考点工作跨DLL边界,或者会要求将这exe和dll使用同样的运行时?

意图是克服问题与对象的所有权。因此目被删除时,都dll和exe不参照它的任何更多。

有帮助吗?

解决方案

据++斯科特迈尔斯在有效的C(第3版),shared_ptrs是跨越DLL边界安全。 shared_ptr的对象保持一个指针,指向从创建它的DLL的析构函数。

  

在他的第18项他说,书“的一个特别好的特性   TR1 :: shared_ptr的是,它会自动使用它的每个指针删除器   以消除另一种潜在的客户错误,“跨DLL问题。”   使用新创建一个对象时,这个问题作物起来   动态链接库(DLL),但在不同的DLL将被删除。上   许多平台上,这样的跨DLL新/删除对导致运行时   错误。 TR1 :: shared_ptr的避免这个问题,因为它的默认删除器   使用来自在其中创建TR1 :: shared_ptr的相同的DLL删除“。

蒂姆·莱舍有一个有趣的疑难杂症观看了,不过,他提到的此处。你需要确保前的shared_ptr终于超出范围创建shared_ptr的DLL是不卸载。我要说的是,在大多数情况下,这是不是你看的东西,但如果你正在创建将被松耦合的dll我会建议不要使用一个shared_ptr。

另一个潜在的不利因素是确保两面用Boost库的兼容版本创建的。 Boost的shared_ptr的已经稳定了很长一段时间。至少从 1.34 它已经TR1兼容。

其他提示

在我看来,如果它不是标准,它不是由你的库提供的对象/机制,那么它不应该是接口的库的一部分。你可以创建自己的对象做引用计数,并可能使用提升的下面,但它不应该在界面中明确暴露出来。

Dll不正常的自己的资源--资源的拥有过程,使用的DLL。你可能是更好的回一个普通的指针,然后储存在一个共用的指针在叫一边。但是,如果没有更多的信息,这就难以100%确定关于这一点。

有得把风如果从DLL接口暴露原始指针。它强迫你使用共享的DLL CRT,在一个CRT分配的内存不能在不同的CRT释放。如果您在使用所有的模块(DLL的&exe文件的)共享的DLL CRT,那么你很好,他们都有着同一个堆,如果你不你会穿越CRT的世界将灾难。

除了这个问题,我同意接受的答案。创办工厂可能不应该明确所有权及生命周期管理的客户端代码。

没有它不是。

boost::shared_ptr<T>的布局可能不会对DLL边界的两侧是相同的。 (布局是由编译器版本的影响,包装编译指示,以及其它的编译选项,以及升压源代码的实际版本。)

只有“标准布局”(一种新的在C ++ 11的概念,与旧的“POD =普通老式数据”的概念)类型可以安全地单独构建的模块之间传递。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top