You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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的能力,支持直接通过初始化列表初始化数组元素,有两种写法:

  1. 显式指定数组大小:
#include <memory>

int main() {
    auto arrp = std::make_unique<double[]>(4, std::initializer_list<double>{0.0, 1.0, 2.0, 3.0});
}
  1. 让编译器自动推导数组大小(更简洁):
#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:32:43