原始指针的默认删除器(unique_ptr)
Default deleter for raw pointer in 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
分配的原始指针是不安全的。我错过了什么吗?有没有更好的解决方案?
因此,
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
。
相关文章:
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误