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
答案 0 :(得分:5)
以上代码是否有潜在危险?
这取决于你用它做什么。
它不会泄漏资源,因为使用default_delete<D[]>
的{{1}}将从delete[]
复制并存储在unique_ptr
中(如{{1}所述) 3}})。
如果
,是否存在陷阱?shared_ptr
稍后被复制到pDerived
?
是的,如果您执行pBase
之类的操作,那么如果pBase.get()[1]
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中。