unique_ptr中原始指针的默认删除器

时间:2018-03-21 10:50:41

标签: c++ c++11 malloc unique-ptr

使用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分配的原始指针不安全。 我错过了什么吗?有更好的解决方案吗?

2 个答案:

答案 0 :(得分:5)

  

因此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

答案 1 :(得分:2)

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

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