std::unique_ptr with custom deleter: regular vs array type

问题描述 投票:0回答:1

假设我有两个功能:

const char* get_string(int id);
bool free_string(const char* str);

我想为他们写一个

std::unique_ptr
包装纸

这个答案我创建了以下内容:

template <auto fn>
struct deleter_from_fn {
    template <typename T>
    constexpr void operator()(T* arg) const {
        fn(arg);
    }
};

using my_string_unique_ptr =
    std::unique_ptr<const char, deleter_from_fn<free_string>>;

但后来我想,它不是指向

const char
的指针,它是指向字符数组的指针。所以我将其替换为以下内容:

using my_string_unique_ptr =
    std::unique_ptr<const char[], deleter_from_fn<free_string>>;

两者似乎都工作得很好。所以我的问题是:

  • 首选哪种变体?
  • 这两种变体之间有什么实际区别吗?
c++ memory smart-pointers unique-ptr
1个回答
2
投票

unique_ptr<T, Deleter>
unique_ptr<T[], Deleter>
之间的主要区别是:

  • 阵列版本有一个
    operator[]
    ,单个版本有
    operator*
    operator->
    。这强调了这样一个事实,即不仅仅是一个元素,因为更难获得对第一个元素的引用。
  • 当从不同类型的指针构造数组版本时,它将检查
    U(*)[]
    是否可转换为
    T(*)[]
    而不是简单地
    U*
    T*
    。这对
    T = const char
    不是很有用,但对于类类型,它可以防止将
    derived_type[N]
    转换为
    base_type[N]
    ,这可能无法正常工作(在指针算术/释放方面)。

如果您有数组,请使用数组版本。

© www.soinside.com 2019 - 2024. All rights reserved.