正确使用shared_ptr来消除跨DLL边界的释放
Correct use of shared_ptr to eliminate deallocation across DLL boundaries
我正在阅读"在dll接口中使用shared_ptr "。在那篇文章中,phlipsy在他的回答的最后提出了一种方法,可以跨DLL边界传递没有实现特定对象的方法。基本上,这个想法是从DLL返回一个原始指针,并在EXE中初始化shared_ptr
。
我认为这是不对的。为了简单起见,让我重新设计一下。
// wrong version??
// DLL
Object* createObject()
{
return new Object;
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
当object
被释放时,shared_ptr
使用的销毁上下文/堆与DLL在构建时使用的销毁上下文/堆不同。
正确使用shared_ptr
的方法是,资源分配应该与shared_ptr
的初始化在同一行,这样分配和回收可以使用同一个堆,如下图所示。
// right version
// DLL
std::tr1::shared_ptr<Object> createObject()
{
return std::tr1::shared_ptr<Object>(new Object);
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
我说的对吗?
你说的都对。第二种正确的方法是通过createObject(..)返回一个原始指针,用它初始化一个shared_ptr,并向shared_ptr传递一个自定义删除器。自定义删除器是一个库函数,如releaseObject(..)。
编辑:使用您的版本(createObject(..)返回shared_ptr<.>),您将绑定到库和库用户的特定shared_ptr实现。
一般规则是分配/释放内存应该始终从相同的模块完成。因此,您可以创建一个与分配器共享的指针,该分配器在分配模块中调用正确的分配方法。
适用于原始指针的规则仍然适用,即使您将它们包装在智能指针中。
相关文章:
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- 在 c++ 中的 dll 边界之间安全地传递数据
- 程序在Windows中的DLL边界上使用嵌入式Python/C 代码崩溃
- 使用抽象接口C++ dll 边界 -标头中的智能指针>?叫删除?
- 是否可以跨 DLL 边界传递 FILE 对象?
- 跨dll边界向构造函数抛出异常
- 使用跨DLL边界的单身人士
- 跨越dll边界的C++智能引用
- 在DLL边界上使用std::move是一种好的做法吗
- 通过dll边界的C字符串
- 跨DLL边界使用Direct2D
- 在 dll 边界上公开 std::vector语言 - 编译器独立性的最佳实践
- 通过dll边界传递对STL矢量的引用
- 我可以在DLL边界使用“enum class”作为函数的参数类型吗
- 如何在VC10中使用具有跨DLL边界的静态数据成员的模板类
- 在跨DLL边界使用的类中将字符串用作私有数据成员是否安全?
- 安全的字符串复制超过DLL边界
- 正确使用shared_ptr来消除跨DLL边界的释放
- 如何使用Boost.Log跨越DLL边界