从工厂返回指针的最佳方法是什么?它应该是std::unique_ptr
还是std::shared_ptr
还是只是一个原始指针?
另外,有人告诉我,如果存在遏制,则应该std::unique_ptr
;如果存在聚合,则应该std::shared_ptr
。这是正确的方法吗?
答案 0 :(得分:5)
您应该仅在非常特殊的情况下考虑原始指针,例如将指针传递到DLL边界。
在shared_ptr
和unique_ptr
之间,我的意见是更喜欢后者。这使界面对用户更灵活。如果他们愿意,他们总是可以将返回的unique_ptr
转换为shared_ptr
,但更重要的是,他们也可以调用unique_ptr::release
然后手动管理指针(可能不是一个好主意,但是它使选项保持打开状态。
如果您的工厂需要为返回的unique_ptr
分配自定义删除器,那么您应该注意的unique_ptr
和shared_ptr
之间的行为差异是前者不会调用如果托管指针是nullptr
,则删除,但后者将。因此,如果您的工厂可能返回nullptr
(可能是失败条件),并且有人将unique_ptr
转换为shared_ptr
,那么请确保删除器可以处理{{1作为它的论点。
答案 1 :(得分:0)
你当然不应该返回一个原始指针。我认为std :: unique_ptr和std :: shared_ptr在大多数情况下都同样好。但当然标准的智能指针类并不是唯一的。例如,有些类实现了侵入式引用计数,人们实现了一个特殊的智能指针类来处理它们,通常称为RefPtr。还有COM接口,有CComPtr。