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

Posted

技术标签:

【中文标题】unique_ptr 中原始指针的默认删除器【英文标题】:Default deleter for raw pointer in unique_ptr 【发布时间】:2018-03-21 10:50:40 【问题描述】:

使用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::vector 并避免这个问题。 对于使用new[] 分配的指针,您应该使用std::unique_ptr&lt;T[]&gt;。在你的情况下,std::unique_ptr&lt;uint8_t[]&gt;. 【参考方案1】:

所以std::unique_ptr 中的默认删除器如下所示:

这是数组的默认删除器。您只会在使用 std::unique_ptr&lt;T[]&gt; 时点击该删除器,而不是在使用 std::unique_ptr&lt;T&gt; 时。


在我看来,new[] 分配的原始指针使用是安全的

只要你使用std::unique_ptr&lt;T[]&gt;,就可以。您应该使用std::make_unique 来避免这些问题。


std::malloc分配的原始指针

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

【讨论】:

严格来说,std::unique_ptr 确实 支持使用std::malloc() 分配的指针 - 通过允许您指定适当的删除器。例如,这在与 C 库交互时会很有用。【参考方案2】:

应该是std::unique_ptr&lt;uint8_t[]&gt;,否则默认删除器不是那个,而是调用普通delete的那个,不匹配会触发UB。

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

【讨论】:

以上是关于unique_ptr 中原始指针的默认删除器的主要内容,如果未能解决你的问题,请参考以下文章

原始指针的 unique_ptr::reset 的等效实现?

[C++11]独占的智能指针unique_ptr的删除器

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

unique_ptr 比原始指针快吗? C++ [关闭]

C++ 中指向 unique_ptr 函数参数的原始指针的目的是啥?

临时将 unique_ptr 强制转换为原始指针