C++ 从工厂返回指针

C++ 从工厂返回指针,c++,c++11,factory,smart-pointers,C++,C++11,Factory,Smart Pointers,从工厂返回指针的最佳方式是什么?它应该是std::unique\u ptr还是std::shared\u ptr还是仅仅是一个原始指针 还有人告诉我,如果有包容,就应该选择std::unique\u ptr,如果有聚合,就应该选择std::shared\u ptr。这是正确的方法吗?您当然不应该返回原始指针。我认为std::unique_ptr和std::shared_ptr在大多数情况下都是一样好的。当然,标准的智能指针类并不是唯一的。例如,有些类实现了侵入式引用计数,人们实现了一个特殊的智能

从工厂返回指针的最佳方式是什么?它应该是
std::unique\u ptr
还是
std::shared\u ptr
还是仅仅是一个原始指针


还有人告诉我,如果有包容,就应该选择
std::unique\u ptr
,如果有聚合,就应该选择
std::shared\u ptr
。这是正确的方法吗?

您当然不应该返回原始指针。我认为std::unique_ptr和std::shared_ptr在大多数情况下都是一样好的。当然,标准的智能指针类并不是唯一的。例如,有些类实现了侵入式引用计数,人们实现了一个特殊的智能指针类来处理它们,通常称为RefPtr。还有COM接口,其中有CComPtr。

您应该只在非常特殊的情况下考虑原始指针,例如在DLL边界上传递指针

shared_ptr
unique_ptr
之间,我的意见是倾向于后者。这使得用户的界面更加灵活。如果愿意,他们总是可以将返回的
unique_ptr
转换为
共享_ptr
,但更重要的是,他们还可以调用
unique_ptr::release
,然后手动管理指针(可能不是一个好主意,但它保留了打开的选项)


如果您的工厂需要为返回的
unique\u ptr
分配一个自定义删除程序,
unique\u ptr
shared\u ptr
之间的行为差异在于,如果托管指针为
nullptr
,前者不会调用删除程序,但后者会调用。因此,如果您的工厂可能返回
nullptr
(可能是一种故障条件),并且有人将
unique\u ptr
转换为
shared\u ptr
,那么请确保删除器可以处理以
nullptr
作为参数的调用。

据我所知,工厂只负责对象的创建。如果我使用唯一的ptr,是否意味着责任转移给工厂的客户。有什么见解吗?对于DLL边界,如果我使用shared_ptr,那么custom deleter将能够调用相应的析构函数,不是吗?@Atul No,
unique_ptr
将在托管对象超出范围时自动删除它。只有在需要在DLL边界上维护C ABI时,才应考虑在DLL边界上传递原始指针。如果这不是一个问题,您可以通过边界传递一个
shared_ptr
。如果您确实需要在DLL边界使用原始指针,您可以让DLL导出返回原始指针的工厂函数和客户端必须调用以销毁对象的deleter函数。然后,在客户端包含的标题中,定义一个调用导出的工厂函数的包装器函数,并将其与调用导出的deleter函数的deleter一起粘贴在
共享的\u ptr
唯一的\u ptr
中。@Praetorian听起来真是太差劲了。为什么不添加一个Destroy方法来删除它所调用的对象呢?无论如何,我一直想知道为什么人们“维护一个C ABI”而不是使用实际的互操作技术。