4

从工厂返回指针的最佳方法是什么?它应该是一个std::unique_ptrstd::shared_ptr只是一个原始指针?

另外,有人告诉我,std::unique_ptr如果有遏制和std::shared_ptr聚集,就应该去。这是正确的方法吗?

4

2 回答 2

5

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

shared_ptr和之间unique_ptr,我的意见是更喜欢后者。这使您的用户界面更加灵活。如果他们愿意,他们总是可以将返回unique_ptr的值转换为 a ,但更重要的是,他们还可以调用然后手动管理指针(这可能不是一个好主意,但它使选项保持打开状态)。shared_ptrunique_ptr::release

如果您的工厂需要为返回的 分配自定义删除器,您应该注意的unique_ptr行为差异是,如果托管指针是 ,则前者不会调用删除器,但后者会。因此,如果您的工厂可能返回(可能作为失败条件),并且有人将 转换为 a ,那么请确保删除器可以处理作为其参数调用的处理。unique_ptrshared_ptrnullptrnullptrunique_ptrshared_ptrnullptr

于 2012-10-25T05:34:33.717 回答
0

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

于 2012-10-25T05:31:46.373 回答