我想知道事实背后的原因是std::shared_ptr
没有为数组定义[]
运算符。特别是std::unique_ptr
为什么要使用此运算符,而不是std::shared_ptr
?
答案 0 :(得分:11)
std::unique_ptr
仅在数组的专门化中定义operator[]
:std::unique_ptr<T[]>
。对于非数组指针,运算符[]无论如何都没有多大意义(仅[0]
)。
std::shared_ptr
的这种专业化缺失(在C ++ 11中),在相关问题中讨论:Why isn't there a std::shared_ptr<T[]> specialisation?
除非您提供自定义删除器,否则不应将非数组智能指针与数组分配一起使用。特别是,unique_ptr<int> p = new int[10]
不好,因为它会调用delete
而不是delete[]
。请改用unique_ptr<int[]>
,调用delete[]
。 (这个实现了operator[]
)。如果您使用shared_ptr
来保留T[]
,则需要使用自定义删除工具。另请参阅shared_ptr to an array : should it be used? - 但它没有提供operator[]
,因为它使用类型擦除来区分数组和非数组(智能指针类型独立于提供的删除器)。 / p>
如果你想知道为什么数组没有shared_ptr
专业化:这是一个提案,但没有包含在标准中(主要是因为你可以通过写{{1}来解决} ptr.get() + i
)。