在DLL接口中使用boost::shared ptr可以吗? 在C++中开发一个返回Boost共享指针并将其用作参数的有效性是有效的吗?< /P>

在DLL接口中使用boost::shared ptr可以吗? 在C++中开发一个返回Boost共享指针并将其用作参数的有效性是有效的吗?< /P>,dll,boost,memory-management,shared-ptr,Dll,Boost,Memory Management,Shared Ptr,那么,像这样导出函数可以吗 1.) boost::shared_ptr<Connection> startConnection(); 2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len); 1.)boost::shared_ptr startConnection(); 2.)无效发送连接(boost::共享连接,字节*数据,整数长度); 特别说明:引用计数是

那么,像这样导出函数可以吗

1.) boost::shared_ptr<Connection> startConnection();
2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);
1.)boost::shared_ptr startConnection();
2.)无效发送连接(boost::共享连接,字节*数据,整数长度);
特别说明:引用计数是跨DLL边界工作还是要求exe和DLL使用相同的运行时


目的是克服对象所有权的问题。因此,当dll和exe不再引用对象时,对象将被删除。

dll通常不拥有资源-资源由使用dll的进程拥有。您最好返回一个普通指针,然后将其存储在调用端的共享指针中。但是如果没有更多的信息,就很难100%确定这一点。

在我看来,如果它不在标准中,也不是您的库提供的对象/机制,那么它就不应该是库接口的一部分。您可以创建自己的对象来进行引用计数,也可以在下面使用boost,但它不应该在接口中显式公开。

如果从dll接口公开原始指针,则需要注意一些问题。它强制您使用共享dll CRT,在一个CRT中分配的内存不能在另一个CRT中释放。如果您在所有模块(dll和exe)中使用共享的dll CRT,那么您很好,它们都共享同一堆,如果您不这样做,您将跨越CRT,世界将崩溃


除此之外,我同意公认的答案。创建工厂可能不应该为客户端代码定义所有权和生命周期管理。< / P> < P>根据Scott Meyers在有效C++(第三版)中,SydDypPTS在DLL边界上是安全的。shared_ptr对象保留一个指向创建析构函数的dll中的析构函数的指针

在第18项的书中,他说,“这是 tr1::shared_ptr是指它自动使用其每指针删除器 为了消除另一个潜在的客户端错误,“跨DLL问题” 当使用“一中新”创建对象时,会出现此问题 动态链接库(DLL),但已在其他DLL中删除。上 许多平台,如跨DLL的新建/删除对,都会导致运行时错误 errors.tr1::shared_ptr避免该问题,因为它是默认的deleter 使用从创建tr1::shared_ptr的同一DLL中删除。“

Tim Lesher提到了一个有趣的gotcha值得注意。您需要确保创建共享\u ptr的DLL在共享\u ptr最终超出范围之前未卸载。我想说的是,在大多数情况下,这不是你必须注意的事情,但是如果你正在创建松散耦合的DLL,那么我建议不要使用共享的ptr

另一个潜在的缺点是确保双方都使用兼容版本的boost库创建。Boost的shared_ptr已经稳定了很长一段时间。至少因为它是tr1兼容的。

不,它不是

boost::shared_ptr
的布局在DLL边界的两侧可能不相同。(布局受编译器版本、打包杂注和其他编译器选项以及Boost源代码的实际版本的影响。)


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

注意:如果链接静态CRT,则会出现问题。静态链接到CRT的每个模块都有自己的堆。如果所有模块都链接到DLL CRT,那么它们都将共享一个堆。如何确保exe和DLL使用共享DLL CRT?这个的编译器标志是什么?