建议的方法是使数组类型的std :: unique_ptr没有值初始化?

时间:2017-08-15 23:53:49

标签: c++ memory-management smart-pointers unique-ptr

我有一些C ++代码,如下所示:

#include <memory>

void do_memory()
{
  std::unique_ptr<int[]> ptr = std::make_unique<int[]>(50);

  int* ptr2 = new int[50];
  delete[] ptr2;
}

在第一种情况下,我正在创建一个指向int数组的唯一指针,第二种情况是,我正在分配一个原始int数组。在范围离开时,两个阵列都会被清理干净。使用此代码(例如https://godbolt.org/g/c3gEfV),我发现这两组指令的优化程序集是不同的,因为make_unique执行值初始化(具体来说,它似乎设置了所分配的所有值)数组为0)。所以make_unique引入了一些不必要的开销。

在没有自动值初始化的情况下,将unique_ptr分配给数组(如上所述)的推荐方法是什么?我已经尝试过例如。

std::unique_ptr<int[]> ptr = std::unique_ptr<int[]>(new int[50]);

但是在我的应用程序中我也有限制,我在编译时不知道我的数组的大小,所以我不想分配任何具有(编译时)常量大小的数组。 / p>

1 个答案:

答案 0 :(得分:3)

如果你真的必须,只需编写自己的功能:

template <typename T>
std::unique_ptr<T> make_unique_uninitialized(const std::size_t size) {
    return unique_ptr<T>(new typename std::remove_extent<T>::type[size]);
}

避免直接创建unique_ptr的诱惑:

std::unique_ptr<T[]>(new T[size])  // BAD

因为这一般不是异常安全的(出于所有通常的原因,你首先使用make_unique - 考虑带有多个参数和异常的函数调用)。