它是确定要使用提升::共享ptr在DLL接口?
-
21-09-2019 - |
题
这是有效制定一个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 =普通老式数据”的概念)类型可以安全地单独构建的模块之间传递。