从唯一\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中。