从唯一\u ptr到阵列的共享\u ptr Scott Meyers在他的书中提到了有效的现代C++,它使用了 SyddyPt/来阻止数组,因为当转换为基类指针时,它在类型系统中创建了“空洞”。

从唯一\u ptr到阵列的共享\u ptr Scott Meyers在他的书中提到了有效的现代C++,它使用了 SyddyPt/来阻止数组,因为当转换为基类指针时,它在类型系统中创建了“空洞”。,c++,c++11,C++,C++11,但是,可以通过以下方式从unique\u ptr创建shared\u ptr std::shared_ptr<D> pDerived = std::shared_ptr<D>(std::make_unique<D[]>(3)); // Create an array of 3 D's 上述代码是否有潜在危险 这取决于你用它做什么 它不会泄漏资源,因为使用delete[]的default\u delete将从unique\u ptr复制并存储在共享\u ptr

但是,可以通过以下方式从
unique\u ptr
创建
shared\u ptr

std::shared_ptr<D> pDerived = std::shared_ptr<D>(std::make_unique<D[]>(3)); // Create an array of 3 D's
上述代码是否有潜在危险

这取决于你用它做什么

它不会泄漏资源,因为使用
delete[]
default\u delete
将从
unique\u ptr
复制并存储在
共享\u ptr
中(如中所述)

如果
pDerived
后来被复制到
pBase
中,是否存在陷阱

std::shared_ptr<B> pBase = pDerived; // B is the base class for D
是的,如果执行类似于
pBase.get()[1]
的操作,那么如果
sizeof(B)!=尺寸(D)

std::experimental::shared_ptr
正确地从支持阵列中获得(如所建议的)

对于TS中的版本,
shared_ptr
不允许从
unique_ptr
构造,但
shared_ptr
允许。无法将
共享\u ptr
转换为
共享\u ptr
,以避免您提到的安全问题

数组的支持可能会使它成为未来的C++标准中的代码> STD::SysDypPTR<代码>,但现在只在TS中。