【发布时间】:2015-07-24 08:11:27
【问题描述】:
感谢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创建的,因为对象首先应该被创建为“共享”或“唯一”对象。
【问题讨论】:
-
如果你想要一个shared-pointer-to-base-class,并且你想用一个raw-pointer-to-derived-class来初始化它呢?
-
@TheParamagneticCroissant:这可以通过
make_shared实现,不是吗? -
我不认为盲目使用
make_shared是一个正确的建议。请记住,当共享 和 弱计数器都达到零时,使用 make shared 分配的内存被释放。这是对对象和控制块使用单一分配的代价。 -
@sbabbi 是的,但是,公平地说,过期的弱指针存在足够长的时间来解决这个问题本身就是一种代码味道。
标签: c++ c++11 shared-ptr