Tar*_*haf 10 dll boost memory-management shared-ptr
在C++中开发一个返回boost共享指针并将它们用作参数的DLL是否有效?
那么,导出这样的函数是否可以?
1.) boost::shared_ptr<Connection> startConnection();
2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);
Run Code Online (Sandbox Code Playgroud)
特别说明:引用计数是跨越DLL边界还是需要exe和dll使用相同的运行时?
目的是克服对象所有权的问题.所以当dll和exe都不再引用它时,对象会被删除.
bse*_*ves 10
根据Scott Meyers的Effective C++(第3版),shared_ptrs在dll边界上是安全的.shared_ptr对象从创建它的dll中保存一个指向析构函数的指针.
他在第18项的书中指出,"tr1 :: shared_ptr的一个特别好的特性就是它会自动使用它的每个指针删除器来消除另一个潜在的客户端错误,即"交叉DLL问题."这个问题在object是在一个动态链接库(DLL)中使用new创建的,但是在不同的DLL中被删除.在许多平台上,这样的跨DLL新/删除对导致运行时错误.tr1 :: shared_ptr避免了这个问题,因为它的默认删除使用从创建tr1 :: shared_ptr的同一DLL中删除."
不过,蒂姆·莱瑟(Tim Lesher)有一个值得关注的问题,他在这里提到了.您需要确保在shared_ptr最终超出范围之前未卸载创建shared_ptr的DLL.我会说,在大多数情况下,这不是你必须注意的事情,但是如果你正在创建松散耦合的dll,那么我建议不要使用shared_ptr.
另一个潜在的缺点是确保双方都使用升级库的兼容版本.Boost的shared_ptr已经稳定了很长一段时间.至少从1.34开始,它与tr1兼容.
归档时间: |
|
查看次数: |
3564 次 |
最近记录: |