从unique_ptr到数组的shared_ptr

时间:2015-09-09 15:15:01

标签: c++ c++11

Scott Meyers在他的书“ Effective Modern C ++ ”中提到,不鼓励使用shared_ptr数组,因为当转换为Base类指针时,它会在类型系统中创建“漏洞”。 / p>

但是,可以通过以下方式从shared_ptr<T>创建unique_ptr<T[]>

std::shared_ptr<D> pDerived = std::shared_ptr<D>(std::make_unique<D[]>(3)); // Create an array of 3 D's

以上代码是否有潜在危险?如果pDerived稍后被复制到pBase

,是否存在陷阱?
std::shared_ptr<B> pBase = pDerived; // B is the base class for D

1 个答案:

答案 0 :(得分:5)

  

以上代码是否有潜在危险?

这取决于你用它做什么。

它不会泄漏资源,因为使用default_delete<D[]>的{​​{1}}将从delete[]复制并存储在unique_ptr中(如{{1}所述) 3}})。

  

如果shared_ptr稍后被复制到pDerived

,是否存在陷阱?

是的,如果您执行pBase之类的操作,那么如果pBase.get()[1]

,则该指针不是指向第二个元素的有效指针 来自Initialization of shared_ptr<T> from unique_ptr<T[]>

sizeof(B) != sizeof(D)正确支持数组(由Library Fundamentals TS提议)。

使用TS中的版本,std::experimental::shared_ptr不允许shared_ptr<D>构建,unique_ptr<D[]>shared_ptr<D[]>shared_ptr<D[]>无法转换为shared_ptr<B[]>,以避免您提及的安全问题。

对数组的支持可能会在未来的C ++标准中进入std::shared_ptr,但目前仅在TS中。