如何使用std::make_unique初始化std::unique_ptr数组?
如何用std::make_unique初始化元素数组
针对替换直接new、改用std::make_unique初始化数组元素的需求,不同C++版本有不同实现方式:
先回顾现有代码
原始堆数组实现:
double* p = new double[4] { 0.0, 1.0, 2.0, 3.0 }; // ... delete[] p;
升级为std::unique_ptr后的写法(无需手动delete[]):
std::unique_ptr<double[]> arrp(new double[4] { 0.0, 1.0, 2.0, 3.0 }); // ...
C++20及以上版本
C++20扩展了std::make_unique的能力,支持直接通过初始化列表初始化数组元素,有两种写法:
- 显式指定数组大小:
#include <memory> int main() { auto arrp = std::make_unique<double[]>(4, std::initializer_list<double>{0.0, 1.0, 2.0, 3.0}); }
- 让编译器自动推导数组大小(更简洁):
#include <memory> int main() { auto arrp = std::make_unique<double[]>(std::initializer_list<double>{0.0, 1.0, 2.0, 3.0}); }
C14/C17版本
这两个版本的std::make_unique不支持直接传递初始化列表给数组,需要先创建值初始化的数组,再手动填充元素:
#include <memory> #include <algorithm> int main() { // 创建包含4个值初始化double的数组(默认值为0.0) auto arrp = std::make_unique<double[]>(4); // 用初始化列表的值填充数组 const double init_values[] = {0.0, 1.0, 2.0, 3.0}; std::copy(std::begin(init_values), std::end(init_values), arrp.get()); }
如果只需要初始化全0数组,直接用std::make_unique<double[]>(4)即可,无需额外赋值。
内容的提问来源于stack exchange,提问作者alfC
相关产品推荐
相关产品推荐

