数组的unique_ptr有什么用吗?

std::unique_ptr 支持数组,例如:


std::unique_ptr<int[]> p(new int[10]);

但是需要吗?也许使用std::vector或更方便std::array。


您发现该构造有什么用吗?


ibeautiful
浏览 1581回答 3
3回答

犯罪嫌疑人X

有些人甚至没有使用std::vector分配器,也不享受使用的奢侈。有些人需要一个动态大小的数组,所以std::array就不用了。有些人从其他已知返回数组的代码中获取数组。而且该代码不会被重写以返回a vector或其他内容。通过允许unique_ptr<T[]>,您可以满足这些需求。简而言之,您unique_ptr<T[]>在需要时使用。当替代品根本无法为您服务时。这是不得已的工具。

慕村9548890

需要权衡,然后选择与您想要的解决方案匹配的解决方案。从我的头顶上:初始尺寸vector并unique_ptr<T[]>允许在运行时指定大小array 仅允许在编译时指定大小调整大小array并且unique_ptr<T[]>不允许调整大小vector 确实存储vector并将unique_ptr<T[]>数据存储在对象外部(通常在堆上)array 将数据直接存储在对象中复制中array并vector允许复制unique_ptr<T[]> 不允许复制交换/移动vector并unique_ptr<T[]>具有O(1)时间swap和移动操作array具有O(n)次时间swap和移动操作,其中n是数组中元素的数量指针/引用/迭代器无效array 确保即使对象处于活动状态,指针,引用和迭代器也不会失效 swap()unique_ptr<T[]>没有迭代器;指针和引用仅swap()在对象处于活动状态时才失效。(交换之后,指针指向交换对象所在的数组,因此在这种意义上它们仍然是“有效的”。)vector 可能会使任何重新分配上的指针,引用和迭代器无效(并提供一些保证,即重新分配只能在某些操作上进行)。与概念和算法的兼容性array而且vector都是容器unique_ptr<T[]> 不是容器我确实必须承认,这似乎是基于策略设计进行某些重构的机会。

白板的微信

可能使用a的原因之一unique_ptr是,如果您不想支付对数组进行值初始化的运行时成本。std::vector<char> vec(1000000); // allocates AND value-initializes 1000000 charsstd::unique_ptr<char[]> p(new char[1000000]); // allocates storage for 1000000 chars该std::vector构造函数和std::vector::resize()将值初始化T-但new不会做,如果T是一个POD。请参见C ++ 11中的值初始化对象和std :: vector构造函数请注意,这vector::reserve不是替代方案:在std :: vector :: reserve之后访问原始指针是否安全?这是同样的原因,C程序员可能选择malloc了calloc。
打开App,查看更多内容
随时随地看视频慕课网APP