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<T[]>
。在你的情况下,std::unique_ptr<uint8_t[]>
.
【参考方案1】:
所以
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
确实 支持使用std::malloc()
分配的指针 - 通过允许您指定适当的删除器。例如,这在与 C 库交互时会很有用。【参考方案2】:
应该是std::unique_ptr<uint8_t[]>
,否则默认删除器不是那个,而是调用普通delete
的那个,不匹配会触发UB。
如果您分配了std::malloc
,则根本无法使用默认删除器,您需要提供自己的调用std::free
的删除器。
【讨论】:
以上是关于unique_ptr 中原始指针的默认删除器的主要内容,如果未能解决你的问题,请参考以下文章
原始指针的 unique_ptr::reset 的等效实现?
指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器