std::make_shared
的存在,我想知道,除了与传统/库代码交互(例如存储工厂的输出)时,使用指向原始指针的 std::shared_ptr
构造函数是否有任何价值。
- 还有其他合法的用例吗?
- 避免使用该构造函数是合理的建议吗?
- 甚至需要在代码中添加检查,以警告程序员每当使用它时?
- 相同的准则(无论是什么)是否适用于
shared_ptr<T>::reset(T*)
?
关于代码检查:
我知道与传统/库代码交互很常见,因此自动化代码检查可能会有问题,但在我遇到的大多数情况下,我更愿意使用 unique_ptr
,而且我也不是在谈论编译器警告,在 -Wall
下弹出,而是在代码审查期间进行静态代码分析的规则。
我的动机:
相对容易地说出“不要使用 std::shared_ptr<T>(new T(...))
,总是优先使用 std::make_shared<T>(...)
"(我认为这是正确的建议?)。但我想知道,如果必须从原始指针创建一个 shared_ptr
,即使 - 或特别是 - 该对象不仅是通过 new
创建的,是否总体上存在设计问题,因为对象应该在第一次创建时就作为“共享”或“唯一”对象创建。
make_shared
实现,不是吗? - MikeMBmake_shared
是正确的建议。请记住,使用make_shared
时,只有当共享和弱引用计数器都达到零时,分配的内存才会被释放。这是使用单个分配对象和控制块的代价。 - sbabbi