原始指针的默认删除器(unique_ptr)

Default deleter for raw pointer in unique_ptr

本文关键字:unique ptr 指针 默认 删除 原始      更新时间:2023-10-16

使用 std::unique_ptr 依赖默认删除器是否安全?

我想像这样使用它:

uint8_t* binaryData = new uint8_t[binaryDataSize];
std::unique_ptr<uint8_t> binPtr(binaryData);

因此,std::unique_ptr中的默认删除器如下所示:

template<typename _Up>
typename enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value>::type
operator()(_Up* __ptr) const
{
    static_assert(sizeof(_Tp)>0,
                  "can't delete pointer to incomplete type");
    delete [] __ptr;
}

从我的角度来看,使用new[]分配的原始指针是安全的,而对于std::malloc分配的原始指针是不安全的。我错过了什么吗?有没有更好的解决方案?

因此,std::unique_ptr中的默认删除器如下所示:

这是数组的默认删除程序。您只会在使用std::unique_ptr<T[]>时点击该删除器,而不是在使用std::unique_ptr<T>时。


从我的角度来看,用于按new[]分配的原始指针是安全的

只要你使用std::unique_ptr<T[]>,是的。您应该使用std::make_unique来避免这些问题。


std::malloc分配的原始指针

std::unique_ptr不支持分配有malloc的指针。无论如何,您不应该在C++中使用malloc

这应该是std::unique_ptr<uint8_t[]>的,否则默认的删除器不是那个,而是调用普通delete的那个,并且不匹配将触发 UB。

如果您分配了 std::malloc ,则根本无法使用默认删除器,您需要提供自己的删除器来调用 std::free