std::unique_ptr<double[]>pad(new double[5])和std::unique_ptr<double>pad[5](new double)有什么区别

`std::unique_ptr<double[]> pad(new double[5])` 和 `std::unique_ptr<double> pad[5](new double)` 这两个语句存在一些区别。

1. 数据类型:第一个语句中的 `std::unique_ptr<double[]>` 表示一个指向动态分配的 `double` 数组的唯一指针。第二个语句中的 `std::unique_ptr<double> pad[5]` 表示一个包含 5 个指向动态分配的 `double` 对象的唯一指针的数组。换句话说,第一个语句以数组的形式管理动态分配的 `double` 数组,而第二个语句以指针数组的形式管理动态分配的 `double` 对象。

2. 内存分配:第一个语句使用 `new double[5]` 在堆上分配了一个存储 5 个 `double` 的数组,并将其指针存储在 `std::unique_ptr<double[]> pad` 中。这意味着 `pad` 现在拥有对数组的所有权,并负责在适当的时候释放内存。第二个语句使用 `new double` 在堆上分配了一个 `double` 对象,并将其指针存储在 `std::unique_ptr<double> pad[5]` 的每个元素中。也就是说,每个元素都具有自己的动态分配的 `double` 对象。

3. 访问方式:对于第一个语句建立的数组,可以使用索引来访问其中的元素,例如 `pad[0]`、`pad[1]` 等。而对于第二个语句建立的指针数组,可以使用索引来访问每个 `std::unique_ptr` 对象,然后通过解引用 `*` 操作符来访问底层的 `double` 对象。

下面是一个示例,演示了两种方式的使用:

#include <memory>
#include <iostream>

int main() {
    // 使用 std::unique_ptr<double[]> 建立数组
    std::unique_ptr<double[]> pad(new double[5]);
    for (int i = 0; i < 5; ++i) {
        pad[i] = i + 1.0;
    }
    for (int i = 0; i < 5; ++i) {
        std::cout << pad[i] << " ";
    }
    std::cout << std::endl;

    // 使用 std::unique_ptr<double> 数组,std::make_unique下面有介绍
    std::unique_ptr<double> pad2[5];
    for (int i = 0; i < 5; ++i) {
        pad2[i] = std::make_unique<double>(i + 1.0);
    }
    for (int i = 0; i < 5; ++i) {
        std::cout << *(pad2[i]) << " ";
    }
    std::cout << std::endl;

    return 0;
}

上述示例中,第一个 `std::unique_ptr<double[]>` 建立了一个大小为 5 的 `double` 数组,并分别赋值为 1.0、2.0、3.0、4.0 和 5.0。第二个 `std::unique_ptr<double> pad[5]` 建立了一个包含 5 个 `std::unique_ptr<double>` 的数组,并每个元素分别指向一个 `double` 对象,并输出它们的值。

std::make_unique介绍

`std::make_unique<double>(i + 1.0)` 是使用 C++11 标准引入的 `std::make_unique` 函数创建一个动态分配的 `double` 对象,并将它的值初始化为 `i + 1.0`。

`std::make_unique` 是一个模板函数,用于创建和返回一个 `std::unique_ptr` 对象,同时将其初始化为指定类型的动态分配对象。该函数接受可变数量的参数作为构造函数的参数,并使用这些参数来构造对象。

在上述示例中,`std::make_unique<double>(i + 1.0)` 将创建一个 `double` 对象,并将其初始化为 `i + 1.0` 的值。这个 `double` 对象会被 `std::unique_ptr` 所拥有,并且在 `std::unique_ptr` 超出作用域时自动释放。

注意,`std::make_unique` 是 C++14 标准引入的函数,不适用于 C++11。如果你使用的是 C++11,可以通过以下方式来创建 `std::unique_ptr` 对象:

std::unique_ptr<double> ptr(new double(i + 1.0));

不过,从 C++14 开始,推荐使用 `std::make_unique` 函数来创建 `std::unique_ptr` 对象,因为这样可以获得更好的代码安全性和可读性。

总结来说,`std::unique_ptr<double[]>` 用于管理动态分配的数组,而 `std::unique_ptr<double> pad[5]` 用于管理多个独立的动态分配的 `double` 对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值