我有一些如下的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]);

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

#1楼 票数: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考虑带有多个参数和引发异常的函数调用)。

  ask by davewy translate from so

未解决问题?本站智能推荐:

1回复

推荐的方法来使std :: unique_ptr的数组类型不进行值初始化?

我有一些如下的C ++代码: 在第一种情况下,我创建了一个指向int数组的唯一指针,在第二种情况下,我在分配了一个原始int数组。 离开示波器时,两个数组都会被清理。 通过这段代码(例如https://godbolt.org/g/c3gEfV ),我发现这两组指令的优化程序集是不同的
2回复

std :: unique_ptr是为数组分配内存的错误工具吗?

我有一个(例如) uint8_t的数组。 std::unique_ptr是用于在内存中管理此对象的错误工具吗? 例如, 这会产生不确定的行为吗? 我想要一个智能指针对象来为我管理一些分配的内存。 std::vector并不理想,因为它是一个动态对象。 std::ar
1回复

std :: unique_ptr的这种行为是预期的吗?

我正在研究一个项目,该项目使用多态性通过重写encode功能来实现对象的encode 。 现在,该项目一直在使用指针来实现多态行为。 由于我的应用程序是相对较新的应用程序,因此我决定从常规的原始指针切换到智能指针并不难,因为它们将自动管理内存。 在我的函数之一中,我返回了std::
1回复

如何从std :: shared_ptr转换为std :: unique_ptr?

因此,我正在尝试为二进制树构建模板类。 我想使用一种特殊的方式来初始化树(可以在main()看到)。 构造函数可以很好地与shared_ptr一起使用,但是我想将其移动到更轻量的unique_ptr ,但是我不知何故到处都得到了错误消息。 有人可以解释如何摆脱shared_ptrs吗?
5回复

何时释放unique_ptr?

在此代码中: void f(std::unique_ptr<int> q) { } void g() { std::unique_ptr<int> p{new int{42}}; f(std::move(p)); } p分配在哪一行? 我想在f
2回复

如何安全地重载 std::unique_ptr 的自定义删除器?

我试图在使用std::unique_ptr时减少代码重复,它是自定义删除器。 我有一些容器Foo , Bar是使用一个自定义分配器分配的,所以不能用delete释放。 所以当前的代码是: 我把它改成: 我怎样才能做得更好,以便通过internal_free分配的任意数量的容器都可以用作s
1回复

为什么将 unique_ptr 的 std::move() 转换为 void 函数以重置指针比调用显式 unique_ptr.reset() 花费的时间更少

我制作了这些 PoC 来找出释放 unique_ptr 内存的最快方法: 输出是: POC1:我花了 2.573e-06 秒。 POC2:我花了 5.07e-07 秒。 PoX 之间有一个数量级的差异,我不明白原因。 有人能给我一盏灯吗?
1回复

我的make_unique有什么问题,如何实现以适应用例

我在下面的代码中编写了唯一指针的基本版本。 我已经复制了Herb Sutter的make_unique()实现, make_unique()无法使其正常工作。 我收到一个错误: 更新:我已经删除了using namespace std; 解决了:
1回复

std::unique_ptr 初始化方法

我看到std::unique_ptr有以下初始化方式: 其中有人可以从std::unique_ptr下方delete分配的some_class 。 和 破坏了std::unique_ptr中“ unique ”的目的,也导致了 UDB。 现在我的问题是:为什么std::unique_pt
2回复

有没有更简洁的方法来初始化 unique_ptr 比这个?

所以目前我有: 是否可以一步直接初始化?